水無瀬の部屋 > Programming > sample > tools > toolsys.cpp |
---|
1: //*********************************************************
2: // プロジェクト: TOOLS
3: // ファイル名: toolsys.cpp
4: //*********************************************************
5: #include <header/toolsys.h> //
6: #include <header/tooldbg.h> //
7: #include <header/snprintf.h> // snprintf(),
8: #include <header/toolbase.h> //
9: #include <header/toolsysx.h> //
10: #include <header/toolwind.h> //
11: #include <process.h> //
12:
13:
14: //---------------------------------------------------------
15: // テスト関数 の 宣言
16: //---------------------------------------------------------
17: DECLARE_TESTPROC( test_vkeyname );
18:
19:
20: //---------------------------------------------------------
21: // マクロ定数 の 定義
22: //---------------------------------------------------------
23: #define VK_MIN ( 0x00 ) // VK_... の最小値
24: #define VK_MAX ( 0xFF ) // VK_... の最大値
25: #define MAX_KEYNAMELENGTH ( numof("Right Control") ) // キー名の最大幅
26: #define CLASSNAME_SHELLTRAYWND ( "Shell_TrayWnd" ) //
27: #define CLASSNAME_TRAYNOTIFYWND ( "TrayNotifyWnd" ) //
28: #define PATH_QUICKLAUNCH "Microsoft\\Internet Explorer\\Quick Launch"
29:
30:
31: //---------------------------------------------------------
32: // マクロ関数 の 定義
33: //---------------------------------------------------------
34: #define SIZE_T_TO_DWORD( u ) ((int)( u )) // _W64
35:
36:
37: //---------------------------------------------------------
38: // 構造体 の 宣言
39: //---------------------------------------------------------
40: typedef int (WINAPI *GetFreeResource_t)(int);
41: typedef unsigned (__stdcall BEGINTHREADEXFUNC_t)(void *);
42: typedef bool (CALLBACK* ENUMDRIVEPROC)( const char *root, void *param );
43: typedef bool (CALLBACK* ENUMFILEPROC)( const char *filename, const WIN32_FIND_DATA *wfd, void *param );
44:
45:
46: //---------------------------------------------------------
47: // ファイルスコープ関数 の 宣言
48: //---------------------------------------------------------
49: static HANDLE CreateFindFileHandle( const char *path, const char *mask, WIN32_FIND_DATA *wfd );
50:
51:
52: //------------------------------------------------------------------------------------------------------------------
53: // a
54: //------------------------------------------------------------------------------------------------------------------
55: //*********************************************************
56: // AddNotifyIcon
57: //*********************************************************
58: bool
59: AddNotifyIcon
60: (
61: NOTIFYICONDATA *nid
62: )
63: {
64: // パラメタの仮定
65: ASSERT( IsValidNotifyIconData( nid ) );
66:
67: return !! Shell_NotifyIcon( NIM_ADD, nid );
68: }//AddNotifyIcon
69:
70: //*********************************************************
71: // AddNotifyIconRetry()
72: //*********************************************************
73: bool
74: AddNotifyIconRetry
75: (
76: NOTIFYICONDATA *nid,
77: int count,
78: int interval
79: )
80: {
81: // パラメタの仮定
82: ASSERT( IsValidNotifyIconData( nid ) );
83: ASSERT( 0 <= count );
84: ASSERT( 0 <= interval );
85:
86: while( !AddNotifyIcon( nid ) )
87: {
88: if ( count-- <= 0 )
89: return false;
90:
91: Sleep( interval );
92: }
93:
94: return true;
95: }//AddNotifyIconRetry
96:
97: //*********************************************************
98: // AllocClipboardData() => DuplicateClipboardData()
99: // クリップボードにある uFormat 型データの複製を得る。
100: // 使用後は関数 free() で破棄せよ。
101: //
102: // HWND hwndOwner
103: // クリップボードを専有するウィンドウ。
104: // HWND_DESKTOP を指定すると現在のタスクがクリップボードを専有する。
105: //
106: // UINT uFormat
107: // クリップボードから取得するデータの型。
108: // CF_TEXT, ...
109: //
110: //*********************************************************
111: void *
112: AllocClipboardData
113: (
114: HWND hwndOwner, // クリップボードを専有するウィンドウ
115: UINT uFormat // 取得するデータの型
116: )
117: {
118: // パラメタの仮定
119: ASSERT( !hwndOwner || IsValidWindow( hwndOwner ) );
120:
121: if ( !OpenClipboard( hwndOwner ) )
122: return null;
123:
124: void *pCopy = null;
125: if ( IsClipboardFormatAvailable( uFormat ) )
126: {
127: HANDLE hMem = GetClipboardData( uFormat );
128: if ( hMem )
129: {
130: SIZE_T dwMemSize = GlobalSize( hMem );
131: if ( 0 < dwMemSize )
132: {
133: const void *pMem = GlobalLock( hMem );
134: if ( pMem )
135: {
136: pCopy = memdup( pMem, dwMemSize );
137: GlobalUnlock( hMem ); // VERIFY( 0 == GlobalUnlock( hMem ) ); とは限らない
138: }
139: }
140: }
141: }
142:
143: VERIFY( CloseClipboard() );
144:
145: return pCopy;
146: }//AllocClipboardData
147:
148: //*********************************************************
149: // AllocRegKeyData
150: //*********************************************************
151: void *
152: AllocRegKeyData
153: (
154: HKEY hKey,
155: const char *name
156: )
157: {
158: // パラメタの仮定
159: ASSERT( IsValidRegKeyHandle( hKey ) );
160: ASSERT( !name || IsValidRegistryValueName( name ) );
161:
162: //
163: DWORD size;
164: if ( !GetRegKeyDataSize( hKey, name, &size ) )
165: return null;
166:
167: //
168: void *buffer = malloc( size );
169: if ( !buffer )
170: return null;
171:
172: //
173: if ( !GetRegKeyData( hKey, name, buffer, size ) )
174: {
175: free( buffer );
176: return null;
177: }
178:
179: return buffer;
180: }//AllocRegKeyData
181:
182: //*********************************************************
183: // AllocRegKeyString
184: //*********************************************************
185: char *
186: AllocRegKeyString
187: (
188: HKEY hKey,
189: const char *name
190: )
191: {
192: // パラメタの仮定
193: ASSERT( IsValidRegKeyHandle( hKey ) );
194: ASSERT( !name || IsValidRegistryValueName( name ) );
195:
196: //
197: char *string = (char *)AllocRegKeyData( hKey, name );
198: ASSERT( IsValidStringPtr( string ) );
199: return string;
200: }//AllocRegKeyString
201:
202:
203: //------------------------------------------------------------------------------------------------------------------
204: // b
205: //------------------------------------------------------------------------------------------------------------------
206: //*********************************************************
207: // BeginThreadEx
208: // スレッドを作成する
209: // 関数が成功するとスレッドのハンドルを返す
210: // 関数が失敗すると NULL を返す
211: //
212: // SECURITY_ATTRIBUTES *pAttributes
213: //
214: // DWORD dwStackSize
215: // スレッドが所有するスタックの バイト数 を指定する
216: // 値 0 を指定するとデフォルトのサイズになる。
217: //
218: // LPTHREAD_START_ROUTINE ThreadFunc
219: //
220: // void *pParam
221: // 関数 ThreadFunc に渡すパラメタ
222: //
223: // DWORD dwFlags
224: // CREATE_SUSPENDED …… スレッドをサスペンド状態で作成する
225: //
226: // DWORD *dwID
227: //
228: //*********************************************************
229: HANDLE
230: BeginThreadEx
231: (
232: SECURITY_ATTRIBUTES *pAttributes,
233: DWORD dwStackSize,
234: LPTHREAD_START_ROUTINE ThreadFunc,
235: void *pParam,
236: DWORD dwFlags,
237: DWORD *dwID
238: )
239: {
240: // パラメタの仮定
241: ASSERT( IsValidCodePtr( ThreadFunc ) );
242: ASSERT( !pAttributes || IsValidPtr( pAttributes, sizeof( *pAttributes ) ) );
243: ASSERT( IsValidPtr( dwID, sizeof( *dwID ) ) );
244:
245: return (HANDLE)_beginthreadex
246: (
247: pAttributes,
248: dwStackSize,
249: (BEGINTHREADEXFUNC_t *)ThreadFunc,
250: pParam,
251: dwFlags,
252: (unsigned *)dwID
253: );
254: }//BeginThreadEx
255:
256:
257: //------------------------------------------------------------------------------------------------------------------
258: // c
259: //------------------------------------------------------------------------------------------------------------------
260: //*********************************************************
261: // CloseRegKey
262: //*********************************************************
263: bool
264: CloseRegKey
265: (
266: HKEY hKey
267: )
268: {
269: // パラメタの仮定
270: ASSERT( IsValidRegKeyHandle( hKey ) );
271:
272: return ERROR_SUCCESS == RegCloseKey
273: (
274: hKey
275: );
276: }//CloseRegKey
277:
278: //*********************************************************
279: // ClearClipboardData()
280: // クリップボードを空にする。
281: //
282: // HWND hwndOwner
283: // クリップボードを専有するウィンドウ。
284: // HWND_DESKTOP を指定すると現在のタスクがクリップボードを専有する。
285: //
286: //*********************************************************
287: bool
288: ClearClipboardData
289: (
290: HWND hwndOwner // クリップボードを専有するウィンドウ
291: )
292: {
293: // パラメタの仮定
294: ASSERT( !hwndOwner || IsValidWindow( hwndOwner ) );
295:
296: if ( !OpenClipboard( hwndOwner ) )
297: {
298: DBG_TRACE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
299: "関数 OpenClipboard() が失敗しました。" );
300: return false;
301: }
302:
303: VERIFY( EmptyClipboard() );
304: VERIFY( CloseClipboard() );
305:
306: return true;
307: }//ClearClipboardData
308:
309: //*********************************************************
310: // CreateHandCursor()
311: // 指カーソル を作る。
312: // 作成した 指カーソルへのハンドル を返す。
313: // 使用後は関数 DestroyCursor() で破棄する。
314: //
315: // HINSTANCE hInstance
316: // カーソル を作成する モジュール の インスタンス
317: //
318: // 使用例:
319: // HINSTANCE hInstance = GetModuleHandle( null );
320: // HCURSOR hCursor = CreateHandCursor( hInstance );
321: // if ( hCursor )
322: // {
323: // …… 省略 ……
324: //
325: // VERIFY( DestroyCursor( hCursor ) );
326: // }
327: //
328: //*********************************************************
329: HCURSOR // 指カーソル への ハンドル
330: CreateHandCursor
331: (
332: HINSTANCE hInstance // カーソル を作成する モジュール の インスタンス
333: )
334: {
335: // カーソル の ビットパターン
336: // AND XOR <表示>
337: // 0 0 …… 黒
338: // 0 1 …… 白
339: // 1 0 …… 透明
340: // 1 1 …… 反転
341:
342: #define m( a, b, c, d ) (((((((( 0 a, (((((((( 0 b, (((((((( 0 c, (((((((( 0 d
343: #define X )*2+1
344: #define _ )*2
345:
346: // AND マスク
347: const BYTE maskAND[ ] =
348: {
349: m( X X X X X X _ _, X X X X X X X X, X X X X X X X X, X X X X X X X X ),
350: m( X X X X X _ _ _, _ X X X X X X X, X X X X X X X X, X X X X X X X X ),
351: m( X X X X X _ _ _, _ X X X X X X X, X X X X X X X X, X X X X X X X X ),
352: m( X X X X X _ _ _, _ X X X X X X X, X X X X X X X X, X X X X X X X X ),
353: m( X X X X X _ _ _, _ X X X X X X X, X X X X X X X X, X X X X X X X X ),
354: m( X X X X X _ _ _, _ _ _ X X X X X, X X X X X X X X, X X X X X X X X ),
355: m( X X X X X _ _ _, _ _ _ _ _ _ X X, X X X X X X X X, X X X X X X X X ),
356: m( X X X X X _ _ _, _ _ _ _ _ _ _ _, X X X X X X X X, X X X X X X X X ),
357: m( X X X X X _ _ _, _ _ _ _ _ _ _ _, _ X X X X X X X, X X X X X X X X ),
358: m( X _ _ _ X _ _ _, _ _ _ _ _ _ _ _, _ _ X X X X X X, X X X X X X X X ),
359: m( X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ X X X X X X, X X X X X X X X ),
360: m( X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ X X X X X X, X X X X X X X X ),
361: m( X X _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ X X X X X X, X X X X X X X X ),
362: m( X X X _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ X X X X X X, X X X X X X X X ),
363: m( X X X _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ X X X X X X, X X X X X X X X ),
364: m( X X X X _ _ _ _, _ _ _ _ _ _ _ _, _ _ X X X X X X, X X X X X X X X ),
365: m( X X X X _ _ _ _, _ _ _ _ _ _ _ _, _ X X X X X X X, X X X X X X X X ),
366: m( X X X X X _ _ _, _ _ _ _ _ _ _ _, _ X X X X X X X, X X X X X X X X ),
367: m( X X X X X _ _ _, _ _ _ _ _ _ _ _, _ X X X X X X X, X X X X X X X X ),
368: m( X X X X X X _ _, _ _ _ _ _ _ _ _, X X X X X X X X, X X X X X X X X ),
369: m( X X X X X X _ _, _ _ _ _ _ _ _ _, X X X X X X X X, X X X X X X X X ),
370: m( X X X X X X _ _, _ _ _ _ _ _ _ _, X X X X X X X X, X X X X X X X X ),
371: m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ),
372: m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ),
373: m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ),
374: m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ),
375: m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ),
376: m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ),
377: m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ),
378: m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ),
379: m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ),
380: m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ),
381: };
382:
383: // XOR マスク
384: const BYTE maskXOR[ ] =
385: {
386: m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
387: m( _ _ _ _ _ _ X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
388: m( _ _ _ _ _ _ X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
389: m( _ _ _ _ _ _ X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
390: m( _ _ _ _ _ _ X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
391: m( _ _ _ _ _ _ X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
392: m( _ _ _ _ _ _ X X, _ X X _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
393: m( _ _ _ _ _ _ X X, _ X X _ X X _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
394: m( _ _ _ _ _ _ X X, _ X X _ X X _ X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
395: m( _ _ _ _ _ _ X X, _ X X _ X X _ X, X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
396: m( _ _ X X _ _ X X, X X X X X X _ X, X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
397: m( _ _ X X X _ X X, X X X X X X X X, X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
398: m( _ _ _ X X _ X X, X X X X X X X X, X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
399: m( _ _ _ _ X _ X X, X X X X X X X X, X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
400: m( _ _ _ _ X X X X, X X X X X X X X, X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
401: m( _ _ _ _ _ X X X, X X X X X X X X, X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
402: m( _ _ _ _ _ X X X, X X X X X X X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
403: m( _ _ _ _ _ _ X X, X X X X X X X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
404: m( _ _ _ _ _ _ X X, X X X X X X X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
405: m( _ _ _ _ _ _ _ X, X X X X X X X _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
406: m( _ _ _ _ _ _ _ X, X X X X X X X _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
407: m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
408: m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
409: m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
410: m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
411: m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
412: m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
413: m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
414: m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
415: m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
416: m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
417: m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ),
418: };
419:
420: #undef m // #define m( a, b, c, d )
421: #undef X // #define X
422: #undef _ // #define _
423:
424:
425: #define HANDCURSOR_WIDTH ( 32 ) // 指カーソルの幅
426: #define HANDCURSOR_HEIGHT ( 32 ) // 指カーソルの高さ
427:
428: COMPILE_ASSERT( numof( maskXOR ) == numof( maskAND ) );
429: COMPILE_ASSERT( (HANDCURSOR_WIDTH * HANDCURSOR_HEIGHT) == (CHAR_BIT * numof( maskAND )) );
430: COMPILE_ASSERT( (HANDCURSOR_WIDTH * HANDCURSOR_HEIGHT) == (CHAR_BIT * numof( maskXOR )) );
431:
432: const int HANDCURSOR_HOTSPOT_X = 7; // ホットスポットの x 座標
433: const int HANDCURSOR_HOTSPOT_Y = 0; // ホットスポットの y 座標
434: return CreateCursor
435: (
436: hInstance, // モジュール の インスタンス
437: HANDCURSOR_HOTSPOT_X, // ホットスポットの x 座標
438: HANDCURSOR_HOTSPOT_Y, // ホットスポットの y 座標
439: HANDCURSOR_WIDTH, // カーソルの幅
440: HANDCURSOR_HEIGHT, // カーソルの高さ
441: maskAND, // AND マスク
442: maskXOR // XOR マスク
443: );
444:
445: #undef HANDCURSOR_WIDTH
446: #undef HANDCURSOR_HEIGHT
447: }//CreateHandCursor
448:
449: //*********************************************************
450: // CreateMutexOnce()
451: //
452: // const char *name
453: // ミューテックス名。
454: // 名前には '\' 以外の任意の文字が使用できる。
455: // 大文字・小文字は区別される。
456: // 最大文字数は MAX_PATH 文字。
457: //
458: //*********************************************************
459: HANDLE // ミューテックス へのハンドル
460: CreateMutexOnce
461: (
462: const char *name // ミューテックス名
463: )
464: {
465: // パラメタの仮定
466: ASSERT( IsValidMutexName( name ) );
467:
468: HANDLE hMutex = CreateMutex( null, true, name );
469: if ( !hMutex || (ERROR_ALREADY_EXISTS == GetLastError()) )
470: {
471: // ハンドルはオープンされているのでミューテックスを解放する。
472: if ( hMutex )
473: {
474: VERIFY( CloseHandle( hMutex ) );
475: }
476:
477: return null;
478: }
479:
480: return hMutex;
481: }//CreateMutexOnce
482:
483: //*********************************************************
484: // CreateNoDropCursor()
485: // ドロップ不可カーソル を作る。
486: // 作成した カーソルへのハンドル を返す。
487: // 使用後は関数 DestroyCursor() で破棄する。
488: //
489: // HINSTANCE hInstance
490: // カーソル を作成する モジュール の インスタンス
491: //
492: // 使用例:
493: // HINSTANCE hInstance = GetModuleHandle( null );
494: // HCURSOR hCursor = CreateNoDropCursor( hInstance );
495: // if ( hCursor )
496: // {
497: // …… 省略 ……
498: //
499: // VERIFY( DestroyCursor( hCursor ) );
500: // }
501: //
502: //*********************************************************
503: HCURSOR // カーソル への ハンドル
504: CreateNoDropCursor
505: (
506: HINSTANCE hInstance // カーソル を作成する モジュール の インスタンス
507: )
508: {
509: // カーソル の ビットパターン
510: // AND XOR <表示>
511: // 0 0 …… 黒
512: // 0 1 …… 白
513: // 1 0 …… 透明
514: // 1 1 …… 反転
515:
516: #define m( a, b, c, d ) (((((((( 0 a, (((((((( 0 b, (((((((( 0 c, (((((((( 0 d
517: #define X )*2+1
518: #define _ )*2
519:
520: // AND マスク
521: const BYTE maskAND[ ] =
522: {
523: m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ),
524: m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ),
525: m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ),
526: m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ),
527: m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ),
528: m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ),
529: m( X X X X X X X X,X X X X X _ _ _,_ _ _ X X X X X,X X X X X X X X ),
530: m( X X X X X X X X,X X X _ _ _ _ _,_ _ _ _ _ X X X,X X X X X X X X ),
531: m( X X X X X X X X,X X _ _ _ _ _ _,_ _ _ _ _ _ X X,X X X X X X X X ),
532: m( X X X X X X X X,X _ _ _ _ _ _ _,_ _ _ _ _ _ _ X,X X X X X X X X ),
533: m( X X X X X X X X,_ _ _ _ _ _ X X,X X _ _ _ _ _ _,X X X X X X X X ),
534: m( X X X X X X X _,_ _ _ _ _ _ X X,X X X X _ _ _ _,_ X X X X X X X ),
535: m( X X X X X X X _,_ _ _ _ _ _ _ X,X X X X X _ _ _,_ X X X X X X X ),
536: m( X X X X X X _ _,_ _ _ _ _ _ _ _,X X X X X _ _ _,_ _ X X X X X X ),
537: m( X X X X X X _ _,_ _ X X _ _ _ _,_ X X X X X _ _,_ _ X X X X X X ),
538: m( X X X X X X _ _,_ _ X X X _ _ _,_ _ X X X X _ _,_ _ X X X X X X ),
539: m( X X X X X X _ _,_ _ X X X X _ _,_ _ _ X X X _ _,_ _ X X X X X X ),
540: m( X X X X X X _ _,_ _ X X X X X _,_ _ _ _ X X _ _,_ _ X X X X X X ),
541: m( X X X X X X _ _,_ _ _ X X X X X,_ _ _ _ _ _ _ _,_ _ X X X X X X ),
542: m( X X X X X X X _,_ _ _ X X X X X,X _ _ _ _ _ _ _,_ X X X X X X X ),
543: m( X X X X X X X _,_ _ _ _ X X X X,X X _ _ _ _ _ _,_ X X X X X X X ),
544: m( X X X X X X X X,_ _ _ _ _ _ X X,X X X _ _ _ _ _,X X X X X X X X ),
545: m( X X X X X X X X,X _ _ _ _ _ _ _,_ _ _ _ _ _ _ X,X X X X X X X X ),
546: m( X X X X X X X X,X X _ _ _ _ _ _,_ _ _ _ _ _ X X,X X X X X X X X ),
547: m( X X X X X X X X,X X X _ _ _ _ _,_ _ _ _ _ X X X,X X X X X X X X ),
548: m( X X X X X X X X,X X X X X _ _ _,_ _ _ X X X X X,X X X X X X X X ),
549: m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ),
550: m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ),
551: m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ),
552: m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ),
553: m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ),
554: m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ),
555: };
556:
557: // XOR マスク
558: const BYTE maskXOR[ ] =
559: {
560: m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ),
561: m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ),
562: m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ),
563: m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ),
564: m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ),
565: m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ),
566: m( _ _ _ _ _ _ _ _,_ _ _ _ _ X X X,X X X _ _ _ _ _,_ _ _ _ _ _ _ _ ),
567: m( _ _ _ _ _ _ _ _,_ _ _ X X _ _ _,_ _ _ X X _ _ _,_ _ _ _ _ _ _ _ ),
568: m( _ _ _ _ _ _ _ _,_ _ X _ _ _ _ _,_ _ _ _ _ X _ _,_ _ _ _ _ _ _ _ ),
569: m( _ _ _ _ _ _ _ _,_ X _ _ _ _ X X,X X _ _ _ _ X _,_ _ _ _ _ _ _ _ ),
570: m( _ _ _ _ _ _ _ _,X _ _ _ X X _ _,_ _ X X _ _ _ X,_ _ _ _ _ _ _ _ ),
571: m( _ _ _ _ _ _ _ X,_ _ _ _ _ X _ _,_ _ _ _ X _ _ _,X _ _ _ _ _ _ _ ),
572: m( _ _ _ _ _ _ _ X,_ _ X _ _ _ X _,_ _ _ _ _ X _ _,X _ _ _ _ _ _ _ ),
573: m( _ _ _ _ _ _ X _,_ _ X X _ _ _ X,_ _ _ _ _ X _ _,_ X _ _ _ _ _ _ ),
574: m( _ _ _ _ _ _ X _,_ X _ _ X _ _ _,X _ _ _ _ _ X _,_ X _ _ _ _ _ _ ),
575: m( _ _ _ _ _ _ X _,_ X _ _ _ X _ _,_ X _ _ _ _ X _,_ X _ _ _ _ _ _ ),
576: m( _ _ _ _ _ _ X _,_ X _ _ _ _ X _,_ _ X _ _ _ X _,_ X _ _ _ _ _ _ ),
577: m( _ _ _ _ _ _ X _,_ X _ _ _ _ _ X,_ _ _ X _ _ X _,_ X _ _ _ _ _ _ ),
578: m( _ _ _ _ _ _ X _,_ _ X _ _ _ _ _,X _ _ _ X X _ _,_ X _ _ _ _ _ _ ),
579: m( _ _ _ _ _ _ _ X,_ _ X _ _ _ _ _,_ X _ _ _ X _ _,X _ _ _ _ _ _ _ ),
580: m( _ _ _ _ _ _ _ X,_ _ _ X _ _ _ _,_ _ X _ _ _ _ _,X _ _ _ _ _ _ _ ),
581: m( _ _ _ _ _ _ _ _,X _ _ _ X X _ _,_ _ _ X _ _ _ X,_ _ _ _ _ _ _ _ ),
582: m( _ _ _ _ _ _ _ _,_ X _ _ _ _ X X,X X X _ _ _ X _,_ _ _ _ _ _ _ _ ),
583: m( _ _ _ _ _ _ _ _,_ _ X _ _ _ _ _,_ _ _ _ _ X _ _,_ _ _ _ _ _ _ _ ),
584: m( _ _ _ _ _ _ _ _,_ _ _ X X _ _ _,_ _ _ X X _ _ _,_ _ _ _ _ _ _ _ ),
585: m( _ _ _ _ _ _ _ _,_ _ _ _ _ X X X,X X X _ _ _ _ _,_ _ _ _ _ _ _ _ ),
586: m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ),
587: m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ),
588: m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ),
589: m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ),
590: m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ),
591: m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ),
592: };
593:
594: #undef m // #define m( a, b, c, d )
595: #undef X // #define X
596: #undef _ // #define _
597:
598:
599: #define NODROPCURSOR_WIDTH ( 32 ) // カーソルの幅
600: #define NODROPCURSOR_HEIGHT ( 32 ) // カーソルの高さ
601:
602: COMPILE_ASSERT( numof( maskXOR ) == numof( maskAND ) );
603: COMPILE_ASSERT( (NODROPCURSOR_WIDTH * NODROPCURSOR_HEIGHT) == (CHAR_BIT * numof( maskAND )) );
604: COMPILE_ASSERT( (NODROPCURSOR_WIDTH * NODROPCURSOR_HEIGHT) == (CHAR_BIT * numof( maskXOR )) );
605:
606: const int NODROPCURSOR_HOTSPOT_X = 15; // ホットスポットの x 座標
607: const int NODROPCURSOR_HOTSPOT_Y = 15; // ホットスポットの y 座標
608: return CreateCursor
609: (
610: hInstance, // モジュール の インスタンス
611: NODROPCURSOR_HOTSPOT_X, // ホットスポットの x 座標
612: NODROPCURSOR_HOTSPOT_Y, // ホットスポットの y 座標
613: NODROPCURSOR_WIDTH, // カーソルの幅
614: NODROPCURSOR_HEIGHT, // カーソルの高さ
615: maskAND, // AND マスク
616: maskXOR // XOR マスク
617: );
618:
619: #undef NODROPCURSOR_WIDTH
620: #undef NODROPCURSOR_HEIGHT
621: }//CreateNoDropCursor
622:
623: //*********************************************************
624: // CreateNotifyIconData
625: //*********************************************************
626: NOTIFYICONDATA *
627: CreateNotifyIconData
628: (
629: HWND hWnd,
630: UINT uID,
631: UINT uMessage,
632: HICON hIcon,
633: const char *szTip
634: )
635: {
636: // パラメタの仮定
637: ASSERT( IsValidWindow( hWnd ) );
638: ASSERT( IsValidIconHandle( hIcon ) );
639: ASSERT( IsValidStringPtr( szTip ) );
640:
641: NOTIFYICONDATA *nid = (NOTIFYICONDATA *)malloc( sizeof( *nid ) );
642: if ( !nid )
643: {
644: return null;
645: }
646:
647: VERIFY( MakeNotifyIconData
648: (
649: nid,
650: hWnd, //
651: uID, //
652: uMessage, //
653: hIcon, //
654: szTip //
655: ) );
656:
657: ASSERT( IsValidNotifyIconData( nid ) );
658: return nid;
659: }//CreateNotifyIconData
660:
661: //*********************************************************
662: // CreateRegKey
663: //*********************************************************
664: bool
665: CreateRegKey
666: (
667: HKEY hkeyRoot,
668: const char *name,
669: REGSAM samDesired,
670: HKEY *hKey
671: )
672: {
673: // パラメタの仮定
674: ASSERT( IsValidRegKeyHandle( hkeyRoot ) );
675: ASSERT( IsValidRegistryKeyName( name ) );
676: ASSERT( IsValidPtr( hKey, sizeof( *hKey ) ) );
677:
678: DWORD dwDumy;
679: return ERROR_SUCCESS == RegCreateKeyEx
680: (
681: hkeyRoot,
682: name,
683: 0, // reserved
684: "",
685: REG_OPTION_NON_VOLATILE,
686: samDesired,
687: null,
688: hKey,
689: &dwDumy
690: );
691: }//CreateRegKey
692:
693: //*********************************************************
694: // CreateShellLinkFile
695: //*********************************************************
696: bool
697: CreateShellLinkFile
698: (
699: DWORD dwClsContext, //
700: const char *lnkname, // ファイル名
701: const char *path, // リンク先
702: const char *param, // 引数
703: const char *work, // 作業ディレクトリ
704: int nShowCmd, //
705: bool bRemember //
706: )
707: {
708: // パラメタの仮定
709: ASSERT( IsValidLocalPathString( lnkname ) );
710: ASSERT( strtstri( lnkname, ".lnk" ) );
711: ASSERT( IsPathExist( path ) );
712: ASSERT( !param || IsValidStringPtr( param ) );
713: ASSERT( !work || IsPathDirectory( work ) );
714:
715: //
716: IShellLink *psl = CreateShellLinkInstanceEx( dwClsContext, path, param, work, nShowCmd );
717: if ( ! psl )
718: {
719: DBG_TRACE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
720: "関数 CreateShellLinkInstanceEx() が失敗しました。" );
721: }
722: else
723: {
724: if ( ! SaveShellLink( psl, lnkname, bRemember ) )
725: {
726: DBG_TRACE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
727: "関数 SaveShellLink() が失敗しました。" );
728: }
729: else
730: {
731: psl->Release();
732: return true;
733: }
734: psl->Release();
735: }
736:
737: return false;
738: }//CreateShellLinkFile
739:
740: //*********************************************************
741: // CreateShellLinkInstance
742: // IShellLink の初期化
743: //*********************************************************
744: IShellLink *
745: CreateShellLinkInstance
746: (
747: DWORD dwClsContext
748: )
749: {
750: // パラメタの仮定
751: ASSERT( CLSCTX_INPROC_SERVER == dwClsContext );
752:
753: IShellLink *psl;
754: if ( S_OK != CoCreateInstance( CLSID_ShellLink, null, dwClsContext, IID_IShellLink, (void **)&psl ) )
755: {
756: DBG_TRACE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
757: "関数 CoCreateInstance() が失敗しました。" );
758: return null;
759: }
760:
761: ASSERT( IsValidPtr( psl, sizeof( *psl ) ) );
762: return psl;
763: }//CreateShellLinkInstance
764:
765: //*********************************************************
766: // CreateShellLinkInstanceEx
767: //*********************************************************
768: IShellLink *
769: CreateShellLinkInstanceEx
770: (
771: DWORD dwClsContext, //
772: const char *path, // リンク先
773: const char *param, // 引数
774: const char *work, // 作業ディレクトリ
775: int nShowCmd //
776: )
777: {
778: // パラメタの仮定
779: ASSERT( IsPathExist( path ) );
780: ASSERT( !param || IsValidStringPtr( param ) );
781: ASSERT( !work || IsPathDirectory( work ) );
782:
783: //
784: IShellLink *psl = CreateShellLinkInstance( dwClsContext );
785: if ( !psl )
786: {
787: DBG_TRACE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
788: "関数 CreateShellLinkInstance() が失敗しました。" );
789: return null;
790: }
791: ASSERT( IsValidPtr( psl, sizeof( *psl ) ) );
792:
793: // 情報の設定
794: if ( (S_OK == psl->SetPath( path ))
795: && (!param || (S_OK == psl->SetArguments( param )))
796: && (!work || (S_OK == psl->SetWorkingDirectory( work )))
797: && (S_OK == psl->SetShowCmd( nShowCmd )) )
798: {
799: return psl;
800: }
801:
802: psl->Release();
803: return null;
804: }//CreateShellLinkInstanceEx
805:
806: //*********************************************************
807: // CreateTemporaryFile()
808: // 一時ファイルを作成する。
809: // 作成した一時ファイルへのストリームを返す。
810: // 作成したファイルは使用者が削除せよ。
811: //*********************************************************
812: FILE * // 作成したファイルへのストリーム
813: CreateTemporaryFile
814: (
815: char *path,
816: int bufsize,
817: const char *mode
818: )
819: {
820: // パラメタの仮定
821: ASSERT( IsEnoughPathBufferSize( bufsize ) ); // [WARN]
822: ASSERT( IsValidStringBufferPtr( path, bufsize ) );
823: DESTROY_TEXT_BUFFER( path, bufsize ); // [破壊]
824:
825: // 複数のプロセスで作業ファイル名が競合しないよう
826: // プロセス毎に異なる値を使いたい
827: const DWORD dwId = GetCurrentProcessId();
828: const int offset = (0xFFFF & (dwId ^ (dwId << 2) ^ (dwId << 4) ^ (dwId << 6)));
829:
830: //
831: {for( int i = 0; i < 1000; ++i )
832: {
833: // 000-999
834: char ext[ MAX_PATH_BUF ];
835: VERIFY( 0 < snprintf( ext, numof( ext ), ".%03d", (i + offset) % 1000 ) );
836: ASSERT( 4 == strlen( ext ) );
837:
838: GetModuleFile( path, bufsize, ext );
839: if ( !IsPathExist( path ) )
840: {
841: FILE *fp = fopen( path, mode );
842: if ( fp )
843: {
844: return fp;
845: }
846: }
847: }}
848:
849: return null;
850: }//CreateTemporaryFile
851:
852: //*********************************************************
853: // CursorInRect
854: // 矩形 rect はスクリーン座標
855: //*********************************************************
856: bool
857: CursorInRect
858: (
859: const RECT *rect
860: )
861: {
862: // パラメタの仮定
863: ASSERT( IsValidReadPtr( rect, sizeof( *rect ) ) );
864:
865: POINT pt;
866: VERIFY( GetCursorPos( &pt ) );
867: return boolean_cast( PtInRect( rect, pt ) );
868: }//CursorInRect
869:
870:
871: //------------------------------------------------------------------------------------------------------------------
872: // d
873: //------------------------------------------------------------------------------------------------------------------
874: //*********************************************************
875: // DeleteNotifyIcon
876: //*********************************************************
877: bool
878: DeleteNotifyIcon
879: (
880: NOTIFYICONDATA *nid
881: )
882: {
883: // パラメタの仮定
884: ASSERT( IsValidNotifyIconData( nid ) );
885:
886: return !! Shell_NotifyIcon( NIM_DELETE, nid );
887: }//DeleteNotifyIcon
888:
889: //*********************************************************
890: // DeleteRegKey
891: //*********************************************************
892: bool
893: DeleteRegKey
894: (
895: HKEY hKey,
896: const char *name
897: )
898: {
899: // パラメタの仮定
900: ASSERT( IsValidRegKeyHandle( hKey ) );
901: ASSERT( IsValidRegistryKeyName( name ) );
902:
903: return ERROR_SUCCESS == RegDeleteKey
904: (
905: hKey,
906: name
907: );
908: }//DeleteRegKey
909:
910: //*********************************************************
911: // DrawLine
912: //*********************************************************
913: bool
914: DrawLine
915: (
916: HDC hDC,
917: POINT ptFrom,
918: POINT ptTo
919: )
920: {
921: // パラメタの仮定
922: ASSERT( hDC );
923:
924: VERIFY( MoveToEx( hDC, ptFrom.x, ptFrom.y, null ) );
925: return !! LineTo( hDC, ptTo.x, ptTo.y );
926: }//DrawLine
927:
928: //*********************************************************
929: // DuplicateDirectory
930: // ディレクトリ TemplateDirectory と同じ属性を持つ
931: // ディレクトリ NewDirectory を作成する
932: //*********************************************************
933: bool
934: DuplicateDirectory
935: (
936: const char *TemplateDirectory,
937: const char *NewDirectory,
938: SECURITY_ATTRIBUTES *pSecurity
939: )
940: {
941: // パラメタの仮定
942: ASSERT( IsValidLocalPathString( NewDirectory ) );
943: ASSERT( IsPathDirectory( TemplateDirectory ) );
944: ASSERT( !pSecurity || IsValidPtr( pSecurity, sizeof( *pSecurity ) ) );
945:
946: // ディレクトリを作成
947: if ( !CreateDirectoryEx( TemplateDirectory, NewDirectory, pSecurity ) )
948: return false; // ディレクトリの作成に失敗
949: ASSERT( IsPathDirectory( NewDirectory ) );
950:
951: // 属性の複写
952: const DWORD dwFileAttributes = GetFileAttributes( TemplateDirectory );
953: return !! SetFileAttributes( NewDirectory, dwFileAttributes );
954: }//DuplicateDirectory
955:
956:
957: //------------------------------------------------------------------------------------------------------------------
958: // e
959: //------------------------------------------------------------------------------------------------------------------
960: //*********************************************************
961: // EnumFile
962: //*********************************************************
963: bool
964: EnumFile
965: (
966: const char *path,
967: const char *mask,
968: ENUMFILEPROC proc,
969: void *param
970: )
971: {
972: // パラメタの仮定
973: ASSERT( IsPathDirectory( path ) );
974: ASSERT( IsValidStringPtr( mask ) );
975: ASSERT( IsValidCodePtr( proc ) );
976:
977: // ディレクトリを走査
978: WIN32_FIND_DATA wfd;
979: HANDLE hFind = CreateFindFileHandle( path, mask, &wfd );
980: if ( INVALID_HANDLE_VALUE != hFind )
981: {
982: bool bContinue = true;
983: do // while( FindNextFile( hFind, &wfd ) );
984: {
985: if ( !streql( ".", wfd.cFileName )
986: && !streql( "..", wfd.cFileName ) )
987: {
988: char filename[ MAX_PATH_BUF ];
989: MakeFullPath( filename, numof( filename ), path, wfd.cFileName );
990: ASSERT( ! IsPathTailSeparator( filename ) );
991: ASSERT( IsPathDescendant( filename, path ) );
992:
993: bContinue = proc( filename, &wfd, param );
994: }
995: }while( bContinue && FindNextFile( hFind, &wfd ) );
996: ASSERT( !bContinue || (ERROR_NO_MORE_FILES == GetLastError()) );
997: VERIFY( FindClose( hFind ) );
998: }
999:
1000: return true;
1001: }//EnumFile
1002:
1003: //*********************************************************
1004: // EnumLogicalDrives
1005: //*********************************************************
1006: bool
1007: EnumLogicalDrives
1008: (
1009: ENUMDRIVEPROC proc,
1010: void *param
1011: )
1012: {
1013: // パラメタの仮定
1014: ASSERT( IsValidCodePtr( proc ) );
1015:
1016: DWORD drives = GetLogicalDrives();
1017: {for( int i = 0; 0 != drives; ++i, drives >>= 1 )
1018: {
1019: char root[] = "A:\\";
1020: root[ 0 ] = static_cast<char>( 'A' + i );
1021: if ( !proc( root, param ) )
1022: {
1023: return false;
1024: }
1025: }}
1026:
1027: return true;
1028: }//EnumLogicalDrives
1029:
1030: //*********************************************************
1031: // EnumRegKey
1032: //*********************************************************
1033: bool
1034: EnumRegKey
1035: (
1036: HKEY hKey,
1037: DWORD index,
1038: char *buffer,
1039: DWORD bufsize
1040: )
1041: {
1042: // パラメタの仮定
1043: ASSERT( IsValidRegKeyHandle( hKey ) );
1044: ASSERT( 0 < bufsize );
1045: ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1046: DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1047:
1048: FILETIME ft;
1049: return ERROR_SUCCESS == RegEnumKeyEx
1050: (
1051: hKey,
1052: index,
1053: buffer,
1054: &bufsize,
1055: null, // reserved
1056: null,
1057: null,
1058: &ft
1059: );
1060: }//EnumRegKey
1061:
1062: //*********************************************************
1063: // EnumRegValueName
1064: //*********************************************************
1065: bool
1066: EnumRegValueName
1067: (
1068: HKEY hKey,
1069: DWORD index,
1070: char *buffer,
1071: DWORD bufsize
1072: )
1073: {
1074: // パラメタの仮定
1075: ASSERT( IsValidRegKeyHandle( hKey ) );
1076: ASSERT( 0 < bufsize );
1077: ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1078: DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1079:
1080: return ERROR_SUCCESS == RegEnumValue
1081: (
1082: hKey,
1083: index,
1084: buffer,
1085: &bufsize,
1086: 0,
1087: null,
1088: null,
1089: null
1090: );
1091: }//EnumRegValueName
1092:
1093:
1094: //------------------------------------------------------------------------------------------------------------------
1095: // f
1096: //------------------------------------------------------------------------------------------------------------------
1097: //*********************************************************
1098: // FindShellTrayWnd
1099: // タスクトレイのハンドルを返す
1100: //*********************************************************
1101: HWND
1102: FindShellTrayWnd
1103: (
1104: void
1105: )
1106: {
1107: HWND hParent = FindWindow( CLASSNAME_SHELLTRAYWND, "" );
1108: return FindWindowEx( hParent, null, CLASSNAME_TRAYNOTIFYWND, "" );
1109: }//FindShellTrayWnd
1110:
1111: //*********************************************************
1112: // fsize
1113: // 失敗時には INVALID_FILE_SIZE を返す。
1114: //*********************************************************
1115: DWORD
1116: fsize
1117: (
1118: const char *path,
1119: DWORD *dwSizeHigh
1120: )
1121: {
1122: // パラメタの仮定
1123: ASSERT( IsPathFile( path ) );
1124: ASSERT( !dwSizeHigh || IsValidPtr( dwSizeHigh, sizeof( *dwSizeHigh ) ) );
1125:
1126: //
1127: DWORD dwSizeLow = INVALID_FILE_SIZE;
1128: if ( dwSizeHigh )
1129: {
1130: *dwSizeHigh = INVALID_FILE_SIZE;
1131: }
1132:
1133: //
1134: HANDLE hFile = CreateFile( path, GENERIC_READ, 0, null, OPEN_EXISTING, 0, null );
1135: if ( INVALID_HANDLE_VALUE != hFile )
1136: {
1137: dwSizeLow = GetFileSize( hFile, dwSizeHigh );
1138: VERIFY( CloseHandle( hFile ) );
1139: return dwSizeLow;
1140: }
1141: else
1142: {
1143: WIN32_FIND_DATA wfd;
1144: if ( !GetFileInformation( path, &wfd ) )
1145: {
1146: return INVALID_FILE_SIZE;
1147: }
1148:
1149: if ( dwSizeHigh )
1150: {
1151: *dwSizeHigh = wfd.nFileSizeHigh;
1152: }
1153:
1154: return wfd.nFileSizeLow;
1155: }
1156: }//fsize
1157:
1158:
1159: //------------------------------------------------------------------------------------------------------------------
1160: // g
1161: //------------------------------------------------------------------------------------------------------------------
1162: //*********************************************************
1163: // GetClientCursorPos
1164: //*********************************************************
1165: bool
1166: GetClientCursorPos
1167: (
1168: HWND hWnd,
1169: POINT *pt
1170: )
1171: {
1172: // パラメタの仮定
1173: ASSERT( IsValidWindow( hWnd ) );
1174: ASSERT( IsValidPtr( pt, sizeof( *pt ) ) );
1175:
1176: VERIFY( GetCursorPos( pt ) );
1177: return boolean_cast( ScreenToClient( hWnd, pt ) );
1178: }//GetClientCursorPos
1179:
1180: //*********************************************************
1181: // GetCreateParam
1182: //*********************************************************
1183: void *
1184: GetCreateParam
1185: (
1186: LPARAM lParam
1187: )
1188: {
1189: // パラメタの仮定
1190: ASSERT( IsValidPtr( (CREATESTRUCT *)lParam, sizeof( CREATESTRUCT ) ) );
1191:
1192: // 設定を
1193: const CREATESTRUCT *cs = reinterpret_cast<CREATESTRUCT *>( lParam );
1194: return cs->lpCreateParams;
1195: }//GetCreateParam
1196:
1197: //*********************************************************
1198: // GetCurrentProcessPriorityClass
1199: //*********************************************************
1200: DWORD
1201: GetCurrentProcessPriorityClass
1202: (
1203: void
1204: )
1205: {
1206: HANDLE hCurrentProcess = GetCurrentProcess();
1207: return !! GetPriorityClass( hCurrentProcess );
1208: }//GetCurrentProcessPriorityClass
1209:
1210: //*********************************************************
1211: // GetFileInformation
1212: // パス path の WIN32_FIND_DATA を取得する
1213: //*********************************************************
1214: bool
1215: GetFileInformation
1216: (
1217: const char *path,
1218: WIN32_FIND_DATA *wfd
1219: )
1220: {
1221: // パラメタの仮定
1222: ASSERT( IsValidLocalPathString( path ) );
1223: ASSERT( IsValidPtr( wfd, sizeof( *wfd ) ) );
1224: DESTROY_BUFFER( wfd, sizeof( *wfd ) ); // [破壊]
1225:
1226: HANDLE hFind = FindFirstFile( path, wfd );
1227: if ( INVALID_HANDLE_VALUE == hFind )
1228: {
1229: return false; // ファイルが見つからず
1230: }
1231:
1232: VERIFY( FindClose( hFind ) );
1233: return true;
1234: }//GetFileInformation
1235:
1236: //*********************************************************
1237: // 関数名:
1238: // GetFreeResource
1239: //
1240: // 戻り値:
1241: // bool …… 関数が成功すると 真 を、
1242: // 関数が失敗すると 偽 を返す。
1243: //
1244: // 引数:
1245: // nSystem …… 使用可能な システムリソース の量(単位%)
1246: // nGdi …… 使用可能な GDIリソース の量(単位%)
1247: // nUser …… 使用可能な USERリソース の量(単位%)
1248: //*********************************************************
1249: bool
1250: GetFreeResource
1251: (
1252: int *nSystem,
1253: int *nGdi,
1254: int *nUser
1255: )
1256: {
1257: // パラメタの仮定
1258: ASSERT( nSystem || nGdi || nUser );
1259:
1260: HINSTANCE hInstance = LoadLibrary( "rsrc32.dll" ); // rsrc32.dll をロード
1261: if ( hInstance )
1262: {
1263: GetFreeResource_t pGetFreeResource; // リソースを取得できる関数
1264: pGetFreeResource = (GetFreeResource_t)GetProcAddress( hInstance, "_MyGetFreeSystemResources32@4" ); // 関数をロード
1265: if ( pGetFreeResource )
1266: {
1267: const int GFR_SYSTEM = ( 0 ); // システムリソース
1268: const int GFR_GDI = ( 1 ); // GDIリソース
1269: const int GFR_USER = ( 2 ); // USERリソース
1270:
1271: if ( nSystem )
1272: *nSystem = pGetFreeResource( GFR_SYSTEM ); // 使用可能なシステムリソース量を取得
1273: if ( nGdi )
1274: *nGdi = pGetFreeResource( GFR_GDI ); // 使用可能なGDIリソース量を取得
1275: if ( nUser )
1276: *nUser = pGetFreeResource( GFR_USER ); // 使用可能なUSERリソース量を取得
1277: FreeLibrary( hInstance );
1278: return true;
1279: }
1280: FreeLibrary( hInstance );
1281: }
1282: return false;
1283: }//GetFreeResource
1284:
1285: //*********************************************************
1286: // GetLocalFileTime()
1287: // 現在の ローカル日時 を FILETIME 形式 で取得する。
1288: //
1289: //
1290: //*********************************************************
1291: bool
1292: GetLocalFileTime
1293: (
1294: FILETIME *ftLocal
1295: )
1296: {
1297: // パラメタの仮定
1298: ASSERT( IsValidPtr( ftLocal, sizeof( *ftLocal ) ) );
1299: DESTROY_BUFFER( ftLocal, sizeof( *ftLocal ) ); // [破壊]
1300:
1301: SYSTEMTIME stLocal;
1302: GetLocalTime( &stLocal );
1303: return !! SystemTimeToFileTime( &stLocal, ftLocal );
1304: }//GetLocalFileTime
1305:
1306: //*********************************************************
1307: // GetLongFileName
1308: // 短いファイル名(8.3形式)から長いファイル名を取得する
1309: //*********************************************************
1310: bool
1311: GetLongFileName
1312: (
1313: const char *shortname,
1314: char *longname,
1315: DWORD bufsize
1316: )
1317: {
1318: // パラメタの仮定
1319: ASSERT( IsEnoughPathBufferSize( bufsize ) ); // [WARN]
1320: ASSERT( IsValidStringBufferPtr( longname, bufsize ) );
1321: ASSERT( IsPathExist( shortname ) );
1322: ASSERT( strlen(shortname) <= MAX_PATH );
1323: ASSERT( (longname > strtail(shortname)) || (shortname > longname + bufsize) );
1324: DESTROY_TEXT_BUFFER( longname, bufsize ); // [破壊]
1325:
1326: //
1327: longname[0] = '\0';
1328:
1329: //
1330: IMalloc *pMalloc;
1331: if ( NOERROR != SHGetMalloc( &pMalloc ) )
1332: return false; // 失敗
1333:
1334: IShellFolder *pshf;
1335: if ( NOERROR == SHGetDesktopFolder( &pshf ) )
1336: {
1337: WCHAR wcShortName[ MAX_PATH_BUF ];
1338: #pragma memo( "MultiByteToWideChar()" )
1339: MultiByteToWideChar( CP_ACP, 0, shortname, -1, wcShortName, min(MAX_PATH, bufsize) );
1340:
1341: // pidl を取得
1342: ULONG chEaten;
1343: ITEMIDLIST *pidl;
1344: if ( NOERROR == pshf->ParseDisplayName( null, null, wcShortName, &chEaten, &pidl, null ) )
1345: {
1346: // パス名を pidl より取得
1347: if ( GetPathFromIDList( pidl, longname, bufsize ) )
1348: {
1349: ASSERT( IsPathExist( longname ) );
1350: ASSERT( strlen(longname) < bufsize );
1351:
1352: pMalloc->Free( pidl );
1353: pshf->Release();
1354: pMalloc->Release();
1355: return true; // 成功
1356: }
1357: pMalloc->Free( pidl );
1358: }
1359: pshf->Release();
1360: }
1361: pMalloc->Release();
1362:
1363: // 失敗
1364: longname[0] = '\0';
1365: return false;
1366: }//GetLongFileName
1367:
1368: //*********************************************************
1369: // GetModuleFile
1370: // 実行ファイルのフルパス名を取得する
1371: // extension = ".ext", null
1372: //
1373: // bufsize = numof(buf)
1374: //*********************************************************
1375: bool
1376: GetModuleFile
1377: (
1378: char *buffer,
1379: int bufsize,
1380: const char *extension
1381: )
1382: {
1383: // パラメタの仮定
1384: ASSERT( IsEnoughPathBufferSize( bufsize ) ); // [WARN]
1385: ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1386: DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1387: ASSERT( !extension || IsValidLocalPathString( extension ) );
1388: ASSERT( !extension || ('.' == extension[ 0 ]) ); // [WARN]
1389: ASSERT( !extension || (buffer > strtail(extension)) || (extension > buffer + bufsize) );
1390:
1391: // 実行ファイル名を取得
1392: HMODULE hModule = GetModuleHandle( null );
1393: if ( ! GetModuleFileName( hModule, buffer, bufsize ) )
1394: {
1395: ERROR_REPORT( "%s(%d) : %s \r\n", __FILE__, __LINE__,
1396: "GetModuleFileName() が失敗しました。" );
1397: return false;
1398: }
1399: ASSERT( IsPathFile( buffer ) );
1400:
1401: // extension が指定されていれば拡張子を変更
1402: if ( extension )
1403: {
1404: VERIFY( *extension == *SwapFileExtension( buffer, bufsize, extension ) );
1405: ASSERT( IsValidLocalPathString( buffer ) );
1406: }
1407:
1408: // 小文字化
1409: StrLower( buffer );
1410:
1411: //
1412: ASSERT( IsValidLocalPathString( buffer ) );
1413: ASSERT( strlen( buffer ) < static_cast<size_t>( bufsize ) );
1414: return true;
1415: }//GetModuleFile
1416:
1417: //*********************************************************
1418: // GetModuleFileLocation
1419: // 実行ファイルのあるフォルダ名をフルパス形式で取得する
1420: // bufsize = numof(buf)
1421: //*********************************************************
1422: bool
1423: GetModuleFileLocation
1424: (
1425: char *buffer,
1426: int bufsize
1427: )
1428: {
1429: // パラメタの仮定
1430: ASSERT( IsEnoughPathBufferSize( bufsize ) ); // [WARN]
1431: ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1432: DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1433:
1434: // 実行ファイルのパス名を取得
1435: HMODULE hModule = GetModuleHandle( null );
1436: VERIFY( 0 < GetModuleFileName( hModule, buffer, bufsize ) );
1437: ASSERT( IsPathFile( buffer ) );
1438:
1439: // フルパス名からをファイル名を切り落とす
1440: VERIFY( buffer < CutFileName( buffer ) );
1441: ASSERT( IsPathDirectory( buffer ) );
1442: ASSERT( strlen(buffer) < (size_t)bufsize );
1443:
1444: return true;
1445: }//GetModuleFileLocation
1446:
1447: //*********************************************************
1448: // GetModuleFileVersionInfo()
1449: //*********************************************************
1450: void *
1451: GetModuleFileVersionInfo
1452: (
1453: HINSTANCE hInstance,
1454: DWORD **dwTrans
1455: )
1456: {
1457: // パラメタの仮定
1458: // ASSERT( IsValidInstanceHandle( hInstance ) );
1459: ASSERT( IsValidPtr( dwTrans, sizeof( *dwTrans ) ) );
1460:
1461: // 実行ファイル名を取得
1462: char filename[ MAX_PATH_BUF ]; // 実行ファイル名
1463: if ( !GetModuleFileName( hInstance, filename, numof( filename ) ) )
1464: {
1465: return null;
1466: }
1467:
1468: ASSERT( IsPathFile( filename ) );
1469: return GetVersionInfo( filename, dwTrans );
1470: }//GetModuleFileVersionInfo
1471:
1472: //*********************************************************
1473: // GetQuickLaunchDirectory()
1474: //*********************************************************
1475: bool
1476: GetQuickLaunchDirectory
1477: (
1478: char *buffer,
1479: size_t bufsize
1480: )
1481: {
1482: // パラメタの仮定
1483: ASSERT( IsEnoughPathBufferSize( bufsize ) ); // [WARN]
1484: ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1485: DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1486:
1487: //
1488: char base[ MAX_PATH_BUF ];
1489: if ( ! GetSpecialFolder( HWND_DESKTOP, CSIDL_APPDATA, base, numof(base) ) )
1490: return false;
1491: ASSERT( IsValidLocalPathString( base ) );
1492:
1493: //
1494: MakeFullPath( buffer, bufsize, base, PATH_QUICKLAUNCH );
1495:
1496: ASSERT( IsValidLocalPathString( buffer ) );
1497: return true;
1498: }//GetQuickLaunchDirectory
1499:
1500: //*********************************************************
1501: // GetRegKeyData
1502: //*********************************************************
1503: bool
1504: GetRegKeyData
1505: (
1506: HKEY hKey,
1507: const char *name,
1508: void *buffer,
1509: DWORD bufsize
1510: )
1511: {
1512: // パラメタの仮定
1513: ASSERT( IsValidRegKeyHandle( hKey ) );
1514: ASSERT( 0 < bufsize );
1515: ASSERT( !name || IsValidRegistryValueName( name ) );
1516: ASSERT( IsValidPtr( buffer, bufsize ) );
1517: DESTROY_BUFFER( buffer, bufsize ); // [破壊]
1518:
1519: return ERROR_SUCCESS == RegQueryValueEx
1520: (
1521: hKey,
1522: name,
1523: null, // reserved
1524: null,
1525: (BYTE *)buffer,
1526: &bufsize
1527: );
1528: }//GetRegKeyData
1529:
1530: //*********************************************************
1531: // GetRegKeyDataSize
1532: //*********************************************************
1533: bool
1534: GetRegKeyDataSize
1535: (
1536: HKEY hKey,
1537: const char *name,
1538: DWORD *size
1539: )
1540: {
1541: // パラメタの仮定
1542: ASSERT( IsValidRegKeyHandle( hKey ) );
1543: ASSERT( !name || IsValidRegistryValueName( name ) );
1544: ASSERT( IsValidPtr( size, sizeof( *size ) ) );
1545:
1546: return ERROR_SUCCESS == RegQueryValueEx
1547: (
1548: hKey,
1549: name,
1550: null, // reserved
1551: null,
1552: null,
1553: size
1554: );
1555: }//GetRegKeyDataSize
1556:
1557: //*********************************************************
1558: // GetRegKeyDataType
1559: //*********************************************************
1560: bool
1561: GetRegKeyDataType
1562: (
1563: HKEY hKey,
1564: const char *name,
1565: DWORD *type
1566: )
1567: {
1568: // パラメタの仮定
1569: ASSERT( IsValidRegKeyHandle( hKey ) );
1570: ASSERT( !name || IsValidRegistryValueName( name ) );
1571: ASSERT( IsValidPtr( type, sizeof( *type ) ) );
1572:
1573: return ERROR_SUCCESS == RegQueryValueEx
1574: (
1575: hKey,
1576: name,
1577: null, // reserved
1578: type,
1579: null,
1580: null
1581: );
1582: }//GetRegKeyDataType
1583:
1584: //*********************************************************
1585: // GetRegKeyString
1586: //*********************************************************
1587: bool
1588: GetRegKeyString
1589: (
1590: HKEY hKey,
1591: const char *name,
1592: char *buffer,
1593: DWORD bufsize
1594: )
1595: {
1596: // パラメタの仮定
1597: ASSERT( IsValidRegKeyHandle( hKey ) );
1598: ASSERT( 0 < bufsize );
1599: ASSERT( !name || IsValidRegistryValueName( name ) );
1600: ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1601: DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1602:
1603: return GetRegKeyData
1604: (
1605: hKey,
1606: name,
1607: buffer,
1608: bufsize
1609: );
1610: }//GetRegKeyString
1611:
1612: //*********************************************************
1613: // GetSpecialFolder
1614: // CSIDL_STARTUP, CSIDL_FAVORITES, etc...
1615: //*********************************************************
1616: bool
1617: GetSpecialFolder
1618: (
1619: HWND hWnd,
1620: int nFolder,
1621: char *buffer,
1622: int bufsize
1623: )
1624: {
1625: // パラメタの仮定
1626: ASSERT( IsEnoughPathBufferSize( bufsize ) ); // [WARN]
1627: ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1628: DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1629:
1630: IMalloc *pMalloc;
1631: if ( NOERROR != SHGetMalloc( &pMalloc ) )
1632: return false;
1633:
1634: ITEMIDLIST *pidl;
1635: if ( NOERROR == SHGetSpecialFolderLocation( hWnd, nFolder, &pidl ) )
1636: {
1637: if ( GetPathFromIDList( pidl, buffer, bufsize ) )
1638: {
1639: pMalloc->Free( pidl );
1640: pMalloc->Release();
1641: return true;
1642: }
1643: pMalloc->Free( pidl );
1644: }
1645: pMalloc->Release();
1646: return false;
1647: }//GetSpecialFolder
1648:
1649: //*********************************************************
1650: // GetVersionInfo
1651: // char *fullpath // バージョン情報を取得したいファイル
1652: // DWORD **dwTrans // 言語情報
1653: //*********************************************************
1654: void *
1655: GetVersionInfo
1656: (
1657: const char *filepath,
1658: DWORD **dwTrans
1659: )
1660: {
1661: // パラメタの仮定
1662: ASSERT( IsValidLocalPathString( filepath ) );
1663: ASSERT( IsValidPtr( dwTrans, sizeof( *dwTrans ) ) );
1664:
1665: DWORD dwDumy;
1666: const DWORD dwSize = GetFileVersionInfoSize( const_cast<char *>( filepath ), &dwDumy );
1667: if ( dwSize <= 0 )
1668: {
1669: return null;
1670: }
1671:
1672: void *pVersionInfo = (void *)malloc( dwSize );
1673: if ( !pVersionInfo )
1674: {
1675: return null;
1676: }
1677:
1678: if ( GetFileVersionInfo( const_cast<char *>( filepath ), null, dwSize, pVersionInfo ) )
1679: {
1680: UINT uDumy;
1681: if ( VerQueryValue( pVersionInfo, "\\VarFileInfo\\Translation", (void **)dwTrans, &uDumy ) )
1682: {
1683: ASSERT( IsValidPtr( *dwTrans, sizeof( *dwTrans ) ) );
1684: return pVersionInfo;
1685: }
1686: }
1687: free( pVersionInfo );
1688:
1689: return null;
1690: }//GetVersionInfo
1691:
1692: //*********************************************************
1693: // GetVersionValue
1694: // Buffer …… ???
1695: // Block …… ???
1696: // Trans …… ???
1697: // KeyWord …… 取得したいバージョン情報を指定します。
1698: // ・"Comments" // Comments(コメント)
1699: // ・"CompanyName" // CompanyName(会社名)
1700: // ・"FileDescription" // FileDescription(説明)
1701: // ・"FileVersion" // FileVersion(ファイルバージョン)
1702: // ・"InternalName" // InternalName(内部名)
1703: // ・"LegalCopyright" // LegalCopyright(著作権)
1704: // ・"LegalTrademarks" // LegalTrademarks(商標)
1705: // ・"OriginalFilename" // OriginalFilename(正式ファイル名)
1706: // ・"PrivateBuild" // PrivateBuild(プライベート情報)
1707: // ・"ProductName" // ProductName(製品名)
1708: // ・"ProductVersion" // ProductVersion(製品バージョン)
1709: // ・"SpecialBuild" // SpecialBuild(スペシャルビルド情報)
1710: //*********************************************************
1711: bool
1712: GetVersionValue
1713: (
1714: char *buffer,
1715: int bufsize,
1716: void *block,
1717: DWORD dwTrans,
1718: const char *keyword
1719: )
1720: {
1721: // パラメタの仮定
1722: ASSERT( 0 < bufsize );
1723: ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1724: ASSERT( block );
1725: ASSERT( IsValidStringPtr( keyword ) );
1726: DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1727:
1728: // Make[Translation]String
1729: char path[ MAX_PATH_BUF ];
1730: VERIFY( 0 < snprintf( path, numof(path)-1,
1731: "\\StringFileInfo\\%04x%04x\\%s", LOWORD(dwTrans), HIWORD(dwTrans), keyword ) );
1732: ASSERT( IsValidStringPtr( path ) );
1733:
1734: UINT uDumy;
1735: char *pValue;
1736: if ( !VerQueryValue( block, path, (void **)&pValue, &uDumy ) )
1737: {
1738: buffer[ 0 ] = '\0';
1739: return false; // 失敗
1740: }
1741:
1742: strcopy( buffer, bufsize, pValue );
1743: ASSERT( IsValidStringPtr( keyword ) );
1744: ASSERT( IsValidStringPtr( buffer ) );
1745: return true;
1746: }//GetVersionValue
1747:
1748: //*********************************************************
1749: // GetVirtualKeyNameText()
1750: // 仮想キー vkey の名前を表す文字列を得る。
1751: // 取得したキー名の 文字列長 を返す。
1752: // キー名を取得できなかった場合は 0 を返す。
1753: //
1754: // char *buffer
1755: // キー名を格納するバッファへのポインタ
1756: //
1757: // int bufsize
1758: // バッファのサイズをバイト数で指定する
1759: //
1760: // UINT vkey
1761: // 仮想キー・コード
1762: // VK_LBUTTON, VK_OEM_CLEAR, ...
1763: //
1764: // bool extend
1765: // 拡張キーボードの拡張キーを区別する。
1766: // ホットキーの HOTKEYF_EXT 修飾と同義?
1767: // VK_NUMPAD0, VK_MULTIPLY, ...
1768: //
1769: //*********************************************************
1770: int // 文字列長
1771: GetVirtualKeyNameText
1772: (
1773: char *buffer, // バッファ
1774: int bufsize, // バッファのサイズ
1775: UINT vkey, // 仮想キー
1776: bool extend // キー拡張
1777: )
1778: {
1779: CALLONCE_TESTPROC( test_vkeyname ); // [テスト]
1780:
1781: // パラメタの仮定
1782: ASSERT( 0 < bufsize );
1783: // ASSERT( MAX_VIRTUALKEYCODENAMELENGTH < bufsize );
1784: ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1785: ASSERT( (VK_MIN <= vkey) && (vkey <= VK_MAX) ); // 根拠なし
1786: DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1787:
1788: // VK_ => scan code
1789: const UINT scan = MapVirtualKey( vkey, 0 );
1790: if ( 0 == scan )
1791: return 0; // 変換できず
1792:
1793: // keyboard message の lParam へ
1794: // 16-23 scan code
1795: // 24 拡張キーボードの拡張キーを区別する
1796: // 25 左右の ctrl, shift を区別しない
1797: const LONG lParam = ((scan << 16) | ( extend ? BIT(24) : 0 ));
1798: if ( 0 == lParam )
1799: return 0; // 変換できず
1800:
1801: // lParam に対応する文字列を得る
1802: const int length = GetKeyNameText( lParam, buffer, bufsize );
1803: ASSERT( (0 <= length) && (length < bufsize) );
1804: ASSERT( (0 == length) || IsValidStringPtr( buffer ) );
1805: ASSERT( (0 == length) || (length == (int)strlen( buffer )) );
1806: ASSERT( length < MAX_KEYNAMELENGTH );
1807:
1808: return length;
1809: }//GetVirtualKeyNameText
1810:
1811: //*********************************************************
1812: // GetVolumeName
1813: //*********************************************************
1814: bool
1815: GetVolumeName
1816: (
1817: const char *root,
1818: char *buffer,
1819: DWORD bufsize
1820: )
1821: {
1822: // パラメタの仮定
1823: ASSERT( 0 < bufsize );
1824: // ASSERT( IsPathDirectory( root ) ); // ドライブにディスクが挿入されているとは限らない
1825: ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1826: DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1827:
1828: DWORD dw1, dw2;
1829: return !! GetVolumeInformation( root, buffer, bufsize, null, &dw1, &dw2, null, null );
1830: }//GetVolumeName
1831:
1832:
1833: //------------------------------------------------------------------------------------------------------------------
1834: // h
1835: //------------------------------------------------------------------------------------------------------------------
1836:
1837: //------------------------------------------------------------------------------------------------------------------
1838: // i
1839: //------------------------------------------------------------------------------------------------------------------
1840: //*********************************************************
1841: // IME_Enable
1842: //*********************************************************
1843: bool
1844: IME_Enable
1845: (
1846: HWND hWnd,
1847: bool bEnable
1848: )
1849: {
1850: // パラメタの仮定
1851: ASSERT( IsValidWindow( hWnd ) );
1852:
1853: HIMC hIMC = ImmGetContext( hWnd );
1854: const bool bSucceed = !! ImmSetOpenStatus( hIMC, bEnable );
1855: VERIFY( ImmReleaseContext( hWnd, hIMC ) );
1856: return bSucceed;
1857: }//IME_Enable
1858:
1859: //*********************************************************
1860: // IME_IsEnabled
1861: //*********************************************************
1862: bool
1863: IME_IsEnabled
1864: (
1865: HWND hWnd
1866: )
1867: {
1868: // パラメタの仮定
1869: ASSERT( IsValidWindow( hWnd ) );
1870:
1871: HIMC hIMC = ImmGetContext( hWnd );
1872: const bool bEnabled = !! ImmGetOpenStatus( hIMC );
1873: VERIFY( ImmReleaseContext( hWnd, hIMC ) );
1874:
1875: return bEnabled;
1876: }//IME_IsEnabled
1877:
1878: //*********************************************************
1879: // IME_SetCompositionWindowPos
1880: //*********************************************************
1881: bool
1882: IME_SetCompositionWindowPos
1883: (
1884: HIMC hIMC,
1885: POINT *ptPos
1886: )
1887: {
1888: // パラメタの仮定
1889: ASSERT( IsValidReadPtr( ptPos, sizeof( *ptPos ) ) );
1890:
1891: COMPOSITIONFORM cf;
1892: memzero( &cf, sizeof( cf ) );
1893: cf.dwStyle = CFS_POINT;
1894: cf.ptCurrentPos = *ptPos;
1895: return boolean_cast( ImmSetCompositionWindow( hIMC, &cf ) );
1896: }//IME_SetCompositionPos
1897:
1898: //*********************************************************
1899: // IsPathDirectory
1900: // パスがディレクトリを指していれば真を返す
1901: //*********************************************************
1902: bool
1903: IsPathDirectory
1904: (
1905: const char *path
1906: )
1907: {
1908: // パラメタの仮定
1909: ASSERT( IsValidLocalPathString( path ) );
1910:
1911: if ( !IsPathExist( path ) )
1912: return false; // パスが存在しない
1913:
1914: const DWORD dwFileAttributes = GetFileAttributes( path );
1915: return FILE_ATTRIBUTE_DIRECTORY == (FILE_ATTRIBUTE_DIRECTORY & dwFileAttributes);
1916: }//IsPathDirectory
1917:
1918: //*********************************************************
1919: // IsPathExist
1920: // パスが存在すれば真を返す
1921: //*********************************************************
1922: bool
1923: IsPathExist
1924: (
1925: const char *path
1926: )
1927: {
1928: // パラメタの仮定
1929: ASSERT( IsValidLocalPathString( path ) );
1930:
1931: const DWORD dwFileAttributes = GetFileAttributes( path );
1932: return INVALID_FILE_ATTRIBUTES != dwFileAttributes;
1933: }//IsPathExist
1934:
1935: //*********************************************************
1936: // IsPathFile
1937: // パスがファイルを指していれば真を返す
1938: //*********************************************************
1939: bool
1940: IsPathFile
1941: (
1942: const char *path
1943: )
1944: {
1945: // パラメタの仮定
1946: ASSERT( IsValidLocalPathString( path ) );
1947:
1948: if ( !IsPathExist( path ) )
1949: return false; // パスが存在しない
1950:
1951: const DWORD dwFileAttributes = GetFileAttributes( path );
1952: return 0 == (FILE_ATTRIBUTE_DIRECTORY & dwFileAttributes);
1953: }//IsPathFile
1954:
1955: //*********************************************************
1956: // IsPathMyself
1957: // パスがファイルを指していれば真を返す
1958: //*********************************************************
1959: bool
1960: IsPathMyself
1961: (
1962: const char *path
1963: )
1964: {
1965: // パラメタの仮定
1966: ASSERT( IsValidLocalPathString( path ) );
1967: ASSERT( IsPathFile( path ) );
1968:
1969: char myself[ MAX_PATH_BUF ];
1970: VERIFY( GetModuleFile( myself, numof(myself), null ) );
1971: ASSERT( IsPathFile( myself ) );
1972:
1973: return streqli( path, myself );
1974: }//IsPathMyself
1975:
1976: //*********************************************************
1977: // IsRegKeyExist
1978: //*********************************************************
1979: bool
1980: IsRegKeyExist
1981: (
1982: HKEY hkeyRoot,
1983: const char *name
1984: )
1985: {
1986: // パラメタの仮定
1987: ASSERT( IsValidRegKeyHandle( hkeyRoot ) );
1988: ASSERT( IsValidStringPtr( name ) );
1989:
1990: // open できなければキーが無いことにする。
1991: HKEY hKey;
1992: if ( !OpenRegKey( hkeyRoot, name, KEY_ALL_ACCESS, &hKey ) )
1993: {
1994: return false;
1995: }
1996:
1997: VERIFY( CloseRegKey( hKey ) );
1998: return true;
1999: }//IsRegKeyExist
2000:
2001: //*********************************************************
2002: // IsSignalObject()
2003: //*********************************************************
2004: bool
2005: IsSignalObject
2006: (
2007: HANDLE handle
2008: )
2009: {
2010: // パラメタの仮定
2011: ASSERT( handle );
2012:
2013: return WAIT_OBJECT_0 == WaitForSingleObject( handle, 0 );
2014: }//IsSignalObject
2015:
2016: //*********************************************************
2017: // IsValidBitmapHandle
2018: // ハンドル hBitmap が HBITMAP として有効であれば 真 を返す
2019: //*********************************************************
2020: bool
2021: IsValidBitmapHandle
2022: (
2023: HBITMAP hBitmap
2024: )
2025: {
2026: VALID_TEST( hBitmap );
2027: VALID_TEST( OBJ_BITMAP == GetObjectType( hBitmap ) );
2028: VALID_TEST( sizeof( BITMAP ) == GetObject( hBitmap, sizeof( BITMAP ), null ) );
2029:
2030: return true;
2031: }//IsValidBitmapHandle
2032:
2033: //*********************************************************
2034: // IsValidBrushHandle
2035: // ハンドル hBrush が HBRUSH として有効であれば 真 を返す
2036: //*********************************************************
2037: bool
2038: IsValidBrushHandle
2039: (
2040: HBRUSH hBrush
2041: )
2042: {
2043: VALID_TEST( hBrush );
2044: VALID_TEST( OBJ_BRUSH == GetObjectType( hBrush ) );
2045: VALID_TEST( sizeof( LOGBRUSH ) == GetObject( hBrush, sizeof( LOGBRUSH ), null ) );
2046:
2047: return true;
2048: }//IsValidBrushHandle
2049:
2050: //*********************************************************
2051: // IsValidCursorHandle
2052: // ハンドル hCursor が HCURSOR として有効であれば 真 を返す
2053: //*********************************************************
2054: bool
2055: IsValidCursorHandle
2056: (
2057: HCURSOR hCursor
2058: )
2059: {
2060: VALID_TEST( hCursor );
2061:
2062: return true;
2063: }//IsValidCursorHandle
2064:
2065: //*********************************************************
2066: // IsValidDeviceContextHandle
2067: // ハンドル hDC が HDC として有効であれば 真 を返す
2068: //*********************************************************
2069: bool
2070: IsValidDeviceContextHandle
2071: (
2072: HDC hDC
2073: )
2074: {
2075: VALID_TEST( hDC );
2076:
2077: const DWORD dwType = GetObjectType( hDC );
2078: VALID_TEST( ( OBJ_DC == dwType )
2079: || ( OBJ_METADC == dwType )
2080: || ( OBJ_MEMDC == dwType )
2081: || ( OBJ_ENHMETADC == dwType ) );
2082:
2083: return true;
2084: }//IsValidDeviceContextHandle
2085:
2086: //*********************************************************
2087: // IsValidDialogTemplate
2088: //*********************************************************
2089: bool
2090: IsValidDialogTemplate
2091: (
2092: const DLGTEMPLATE *dlg
2093: )
2094: {
2095: VALID_TEST( IsValidReadPtr( dlg, sizeof( *dlg ) ) );
2096: VALID_TEST( 0 <= dlg->cdit );
2097: VALID_TEST( 0 <= dlg->cx );
2098: VALID_TEST( 0 <= dlg->cy );
2099:
2100: return true;
2101: }//IsValidDialogTemplate
2102:
2103: //*********************************************************
2104: // IsValidDialogItemTemplate
2105: //*********************************************************
2106: bool
2107: IsValidDialogItemTemplate
2108: (
2109: const DLGITEMTEMPLATE *item
2110: )
2111: {
2112: VALID_TEST( IsValidReadPtr( item, sizeof( *item ) ) );
2113: ASSERT( WS_CHILD == (WS_CHILD & item->style) );
2114: VALID_TEST( 0 <= item->cx );
2115: VALID_TEST( 0 <= item->cy );
2116:
2117: return true;
2118: }//IsValidDialogItemTemplate
2119:
2120: //*********************************************************
2121: // IsValidFontHandle
2122: // ハンドル hFont が HFONT として有効であれば 真 を返す
2123: //*********************************************************
2124: bool
2125: IsValidFontHandle
2126: (
2127: HFONT hFont
2128: )
2129: {
2130: VALID_TEST( hFont );
2131: VALID_TEST( OBJ_FONT == GetObjectType( hFont ) );
2132: VALID_TEST( sizeof( LOGFONT ) == GetObject( hFont, sizeof( LOGFONT ), null ) );
2133:
2134: return true;
2135: }//IsValidFontHandle
2136:
2137: //*********************************************************
2138: // IsValidGlobalMemoryHandle
2139: //*********************************************************
2140: bool
2141: IsValidGlobalMemoryHandle
2142: (
2143: HGLOBAL hGlobal,
2144: DWORD size
2145: )
2146: {
2147: // パラメタの仮定
2148: ASSERT( 0 < size );
2149:
2150: VALID_TEST( hGlobal );
2151:
2152: const UINT flags = GlobalFlags( hGlobal );
2153: VALID_TEST( GMEM_INVALID_HANDLE != flags );
2154: VALID_TEST( 0 == (GMEM_DISCARDED & flags ) );
2155:
2156: // 仮定されるサイズを保持しているか
2157: VALID_TEST( size <= GlobalSize( hGlobal ) );
2158:
2159: return true;
2160: }//IsValidGlobalMemoryHandle
2161:
2162: //*********************************************************
2163: // IsValidIconHandle
2164: // ハンドル hIcon が HICON として有効であれば 真 を返す
2165: //*********************************************************
2166: bool
2167: IsValidIconHandle
2168: (
2169: HICON hIcon
2170: )
2171: {
2172: VALID_TEST( hIcon );
2173:
2174: return true;
2175: }//IsValidIconHandle
2176:
2177: //*********************************************************
2178: // IsValidInstanceHandle
2179: //*********************************************************
2180: bool
2181: IsValidInstanceHandle
2182: (
2183: HINSTANCE hInstance
2184: )
2185: {
2186: VALID_TEST( hInstance );
2187:
2188: return true;
2189: }//IsValidInstanceHandle
2190:
2191: //*********************************************************
2192: // IsValidLocalMemory
2193: //*********************************************************
2194: bool
2195: IsValidLocalMemory
2196: (
2197: HLOCAL hLocal
2198: )
2199: {
2200: VALID_TEST( hLocal );
2201: VALID_TEST( LMEM_INVALID_HANDLE != LocalFlags( hLocal ) );
2202:
2203: return true;
2204: }//IsValidLocalMemory
2205:
2206: //*********************************************************
2207: // IsValidLocalMemoryEx
2208: //*********************************************************
2209: bool
2210: IsValidLocalMemoryEx
2211: (
2212: HLOCAL hLocal,
2213: int nMinSize,
2214: int nMaxSize
2215: )
2216: {
2217: // パラメタの仮定
2218: ASSERT( 0 < nMinSize );
2219: ASSERT( nMinSize <= nMaxSize );
2220:
2221: VALID_TEST( hLocal );
2222: VALID_TEST( IsValidLocalMemory( hLocal ) );
2223:
2224: const int size = (int)LocalSize( hLocal );
2225: VALID_TEST( (nMinSize <= size) && (size <= nMaxSize) );
2226:
2227: return true;
2228: }//IsValidLocalMemoryEx
2229:
2230: //*********************************************************
2231: // IsValidMemoryDeviceContextHandle
2232: // ハンドル hMemDC が HMEMDC として有効であれば 真 を返す
2233: //*********************************************************
2234: bool
2235: IsValidMemoryDeviceContextHandle
2236: (
2237: HDC hMemDC
2238: )
2239: {
2240: VALID_TEST( hMemDC );
2241: VALID_TEST( OBJ_MEMDC == GetObjectType( hMemDC ) );
2242:
2243: return true;
2244: }//IsValidMemoryDeviceContextHandle
2245:
2246: //*********************************************************
2247: // IsValidMutexName
2248: //*********************************************************
2249: bool //
2250: IsValidMutexName
2251: (
2252: const char *name // ミューテックス名
2253: )
2254: {
2255: VALID_TEST( IsValidStringPtr( name ) );
2256: VALID_TEST( strlen( name ) < MAX_PATH );
2257: VALID_TEST( null == jmschr( name, '\\' ) );
2258:
2259: return true;
2260: }//IsValidMutexName
2261:
2262: //*********************************************************
2263: // IsValidNotifyIconData
2264: //*********************************************************
2265: bool
2266: IsValidNotifyIconData
2267: (
2268: const NOTIFYICONDATA *nid
2269: )
2270: {
2271: VALID_TEST( IsValidReadPtr( nid, sizeof( *nid ) ) );
2272: VALID_TEST( sizeof( *nid ) == nid->cbSize );
2273: VALID_TEST( IsValidWindow( nid->hWnd ) );
2274: VALID_TEST( IsValidIconHandle( nid->hIcon ) );
2275: VALID_TEST( IsValidStringPtr( nid->szTip ) );
2276: VALID_TEST( strlen( nid->szTip ) < numof( nid->szTip ) );
2277:
2278: return true;
2279: }//IsValidNotifyIconData
2280:
2281: //*********************************************************
2282: // IsValidRegistryKeyName
2283: //*********************************************************
2284: bool
2285: IsValidRegistryKeyName
2286: (
2287: const char *name
2288: )
2289: {
2290: VALID_TEST( name );
2291: VALID_TEST( IsValidStringPtr( name ) );
2292:
2293: return true;
2294: }//IsValidRegistryKeyName
2295:
2296: //*********************************************************
2297: // IsValidRegistryValueName
2298: //*********************************************************
2299: bool
2300: IsValidRegistryValueName
2301: (
2302: const char *name
2303: )
2304: {
2305: VALID_TEST( name );
2306: VALID_TEST( IsValidStringPtr( name ) );
2307:
2308: return true;
2309: }//IsValidRegistryValueName
2310:
2311: //*********************************************************
2312: // IsValidRegKeyHandle
2313: //*********************************************************
2314: bool
2315: IsValidRegKeyHandle
2316: (
2317: HKEY hKey
2318: )
2319: {
2320: VALID_TEST( hKey );
2321:
2322: return true;
2323: }//IsValidRegKeyHandle
2324:
2325: //*********************************************************
2326: // IsValidResourceName
2327: //*********************************************************
2328: bool
2329: IsValidResourceName
2330: (
2331: const char *name
2332: )
2333: {
2334: VALID_TEST( name );
2335: VALID_TEST( IS_INTRESOURCE( name )
2336: || IsValidStringPtr( name ) );
2337:
2338: return true;
2339: }//IsValidResourceName
2340:
2341:
2342: //------------------------------------------------------------------------------------------------------------------
2343: // j
2344: //------------------------------------------------------------------------------------------------------------------
2345:
2346: //------------------------------------------------------------------------------------------------------------------
2347: // k
2348: //------------------------------------------------------------------------------------------------------------------
2349:
2350: //------------------------------------------------------------------------------------------------------------------
2351: // l
2352: //------------------------------------------------------------------------------------------------------------------
2353: //*********************************************************
2354: // LoadIconImage()
2355: // アイコンをロードする。
2356: // ロードしたアイコンのハンドルを返す。
2357: // ロードに失敗すると null を返す。
2358: // ロードしたアイコンは DestroyIcon() で破棄せよ。
2359: //
2360: // HINSTANCE hInstance
2361: // ロードするアイコンを含むモジュールのハンドル
2362: //
2363: // const char *name
2364: // ロードするアイコンリソースの名前
2365: // または OEM アイコンの識別値
2366: //
2367: // int width
2368: // アイコンのピクセル幅
2369: //
2370: // int height
2371: // アイコンのピクセル高
2372: //
2373: // UINT flags
2374: // LR_DEFAULTSIZE, LR_LOADMAP3DCOLORS, LR_LOADTRANSPARENT, LR_MONOCHROME, ...
2375: //
2376: //*********************************************************
2377: HICON // アイコンのハンドル
2378: LoadIconImage
2379: (
2380: HINSTANCE hInstance, // アイコンを含むモジュール
2381: const char *name, // アイコンリソースの名前
2382: int width, // ピクセル幅
2383: int height, // ピクセル高
2384: UINT flags //
2385: )
2386: {
2387: // パラメタの仮定
2388: ASSERT( IsValidResourceName( name ) );
2389: ASSERT( LR_LOADFROMFILE != (LR_LOADFROMFILE & flags) ); // NT が非対応
2390:
2391: return (HICON)LoadImage( hInstance, name, IMAGE_ICON, width, height, flags );
2392: }//LoadIconImage
2393:
2394: //*********************************************************
2395: // LoadShellLink
2396: // dwMode = STGM_READ, ...
2397: //*********************************************************
2398: bool
2399: LoadShellLink
2400: (
2401: IShellLink *psl,
2402: const WCHAR *wcLinkName,
2403: DWORD dwMode
2404: )
2405: {
2406: // パラメタの仮定
2407: ASSERT( IsValidPtr( psl, sizeof( *psl ) ) );
2408: ASSERT( IsValidStringPtr( (char *)wcLinkName ) );
2409:
2410: IPersistFile *ppf = ShellLink_QueryPersistFileInterface( psl );
2411: if ( !ppf )
2412: return false;
2413:
2414: const HRESULT hResult = ppf->Load( wcLinkName, dwMode );
2415: ppf->Release();
2416:
2417: return S_OK == hResult;
2418: }//LoadShellLink
2419:
2420: //*********************************************************
2421: // LoadShellLinkInstance()
2422: // ショートカット path へのインタフェイスを取得する
2423: //*********************************************************
2424: IShellLink *
2425: LoadShellLinkInstance
2426: (
2427: DWORD dwClsContext, //
2428: const char *path, // インタフェイス を取得する ファイル への パス
2429: DWORD dwMode // 読込モード
2430: )
2431: {
2432: // パラメタの仮定
2433: ASSERT( IsPathFile( path ) );
2434: ASSERT( CLSCTX_INPROC_SERVER == dwClsContext );
2435: ASSERT( STGM_READ == dwMode );
2436:
2437: // IShellLink の初期化
2438: IShellLink *psl = CreateShellLinkInstance( dwClsContext );
2439: if ( !psl )
2440: {
2441: return false; // [失敗]
2442: }
2443: ASSERT( IsValidPtr( psl, sizeof( *psl ) ) );
2444:
2445: // ショートカットのロード
2446: const int count = MultiByteToWideChar( CP_ACP, 0, path, -1, null, 0 );
2447: if ( 0 < count )
2448: {
2449: WCHAR *wcPath = (WCHAR *)malloc( (1 + count) * sizeof( *wcPath ) );
2450: if ( wcPath )
2451: {
2452: VERIFY( count == MultiByteToWideChar( CP_ACP, 0, path, -1, wcPath, count ) );
2453: if ( LoadShellLink( psl, wcPath, dwMode ) )
2454: {
2455: free( wcPath );
2456: return psl; // [成功]
2457: }
2458: free( wcPath );
2459: }
2460: }
2461:
2462: psl->Release();
2463: return null; // [失敗]
2464: }//LoadShellLinkInstance
2465:
2466:
2467: //------------------------------------------------------------------------------------------------------------------
2468: // m
2469: //------------------------------------------------------------------------------------------------------------------
2470: //*********************************************************
2471: // MakeDialogTemplate
2472: //*********************************************************
2473: bool
2474: MakeDialogTemplate
2475: (
2476: DLGTEMPLATE *dlg,
2477: WORD count,
2478: DWORD dwStyleEx,
2479: DWORD dwStyle,
2480: short x,
2481: short y,
2482: short cx,
2483: short cy
2484: )
2485: {
2486: // パラメタの仮定
2487: ASSERT( IsValidPtr( dlg, sizeof( *dlg ) ) );
2488: ASSERT( 0 <= count );
2489: ASSERT( 0 <= cx );
2490: ASSERT( 0 <= cy );
2491:
2492: dlg->style = dwStyle;
2493: dlg->dwExtendedStyle = dwStyleEx;
2494: dlg->cdit = count;
2495: dlg->x = x;
2496: dlg->y = y;
2497: dlg->cx = cx;
2498: dlg->cy = cy;
2499:
2500: ASSERT( IsValidDialogTemplate( dlg ) );
2501: return true;
2502: }//MakeDialogTemplate
2503:
2504: //*********************************************************
2505: // MakeDialogItemTemplate
2506: //*********************************************************
2507: bool
2508: MakeDialogItemTemplate
2509: (
2510: DLGITEMTEMPLATE *item,
2511: WORD wID,
2512: DWORD dwStyleEx,
2513: DWORD dwStyle,
2514: short x,
2515: short y,
2516: short cx,
2517: short cy
2518: )
2519: {
2520: // パラメタの仮定
2521: ASSERT( IsValidPtr( item, sizeof( *item ) ) );
2522: ASSERT( WS_CHILD == (WS_CHILD & dwStyle) );
2523: ASSERT( 0 <= cx );
2524: ASSERT( 0 <= cy );
2525:
2526: item->style = dwStyle;
2527: item->dwExtendedStyle = dwStyleEx;
2528: item->x = x;
2529: item->y = y;
2530: item->cx = cx;
2531: item->cy = cy;
2532: item->id = wID;
2533:
2534: ASSERT( IsValidDialogItemTemplate( item ) );
2535: return true;
2536: }//MakeDialogItemTemplate
2537:
2538: //*********************************************************
2539: // MakeNotifyIconData
2540: // 構造体 NOTIFYICONDATA を初期化する
2541: //*********************************************************
2542: bool
2543: MakeNotifyIconData
2544: (
2545: NOTIFYICONDATA *nid,
2546: HWND hWnd,
2547: UINT uID,
2548: UINT uMessage,
2549: HICON hIcon,
2550: const char *szTip
2551: )
2552: {
2553: // パラメタの仮定
2554: ASSERT( IsValidPtr( nid, sizeof( *nid ) ) );
2555: ASSERT( IsValidWindow( hWnd ) );
2556: ASSERT( IsValidIconHandle( hIcon ) );
2557: ASSERT( IsValidStringPtr( szTip ) );
2558:
2559: memzero( nid, sizeof( *nid ) );
2560: nid->cbSize = sizeof( *nid );
2561: nid->hWnd = hWnd;
2562: nid->uID = uID;
2563: nid->uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
2564: nid->uCallbackMessage = uMessage;
2565: nid->hIcon = hIcon;
2566: strcopy( nid->szTip, numof( nid->szTip ), szTip );
2567:
2568: ASSERT( IsValidNotifyIconData( nid ) );
2569: return true;
2570: }//MakeNotifyIconData
2571:
2572: //*********************************************************
2573: // ModifyNotifyIcon
2574: //*********************************************************
2575: bool
2576: ModifyNotifyIcon
2577: (
2578: NOTIFYICONDATA *nid
2579: )
2580: {
2581: // パラメタの仮定
2582: ASSERT( IsValidNotifyIconData( nid ) );
2583:
2584: return !! Shell_NotifyIcon( NIM_MODIFY, nid );
2585: }//ModifyNotifyIcon
2586:
2587: //*********************************************************
2588: // MoveFileToRecycleBin
2589: // pFrom は "\0\0" で終了する '\0' で区切られた文字列
2590: //*********************************************************
2591: bool
2592: MoveFileToRecycleBin
2593: (
2594: HWND hWnd,
2595: const char *pFrom,
2596: WORD wFlags
2597: )
2598: {
2599: // パラメタの仮定
2600: ASSERT( !hWnd || IsValidWindow( hWnd ) );
2601: ASSERT( IsValidLocalPathString( pFrom ) );
2602:
2603: #ifdef _DEBUG // デバッグ時のみ
2604: {for( const char *p = pFrom; '\0' != *p; p = 1 + strtail( p ) )
2605: {
2606: ASSERT( IsValidLocalPathString( p ) );
2607: }}
2608: #endif // #ifdef _DEBUG
2609:
2610: SHFILEOPSTRUCT shfos;
2611: memzero( &shfos, sizeof( shfos ) );
2612: shfos.hwnd = hWnd;
2613: shfos.wFunc = FO_DELETE;
2614: shfos.pFrom = pFrom;
2615: shfos.pTo = null;
2616: shfos.fFlags = static_cast<WORD>( wFlags | FOF_ALLOWUNDO );
2617: VERIFY( 0 == SHFileOperation( &shfos ) );
2618: VERIFY( 0 == shfos.fAnyOperationsAborted );
2619: return true;
2620: }//MoveFileToRecycleBin
2621:
2622:
2623: //------------------------------------------------------------------------------------------------------------------
2624: // n
2625: //------------------------------------------------------------------------------------------------------------------
2626:
2627: //------------------------------------------------------------------------------------------------------------------
2628: // o
2629: //------------------------------------------------------------------------------------------------------------------
2630: //*********************************************************
2631: // OpenFileLocation
2632: // ファイルのあるフォルダを開きます
2633: //*********************************************************
2634: bool
2635: OpenFileLocation
2636: (
2637: HWND hWnd,
2638: const char *filepath,
2639: int nShow
2640: )
2641: {
2642: // パラメタの仮定
2643: ASSERT( !hWnd || IsValidWindow( hWnd ) );
2644: ASSERT( IsPathExist( filepath ) );
2645:
2646: char path[ MAX_PATH_BUF ];
2647: strcopy( path, numof( path ), filepath );
2648: CutFileName( path );
2649: ASSERT( IsPathDirectory( path ) );
2650:
2651: return SHELLEXECUTE_SUCCEEDED( MyShellExecute( hWnd, "open", path, null, null, nShow ) );
2652: }//OpenFileLocation
2653:
2654: //*********************************************************
2655: // OpenRegKey
2656: // samDesired, KEY_ALL_ACCESS
2657: // HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS ……
2658: //*********************************************************
2659: bool
2660: OpenRegKey
2661: (
2662: HKEY hkeyRoot,
2663: const char *name,
2664: REGSAM samDesired,
2665: HKEY *phKey
2666: )
2667: {
2668: // パラメタの仮定
2669: ASSERT( IsValidRegKeyHandle( hkeyRoot ) );
2670: ASSERT( IsValidRegistryKeyName( name ) );
2671: ASSERT( IsValidPtr( phKey, sizeof( *phKey ) ) );
2672:
2673: return ERROR_SUCCESS == RegOpenKeyEx
2674: (
2675: hkeyRoot,
2676: name,
2677: 0, // reserved
2678: samDesired,
2679: phKey
2680: );
2681: }//OpenRegKey
2682:
2683: //*********************************************************
2684: // OpenSpecialFolder
2685: // nID = CSIDL_SENDTO, CSIDL_FAVORITES, ...
2686: //*********************************************************
2687: bool
2688: OpenSpecialFolder
2689: (
2690: HWND hWnd,
2691: int nID,
2692: int nShow
2693: )
2694: {
2695: bool bSuccess;
2696:
2697: char path[ MAX_PATH_BUF ];
2698: VERIFY( bSuccess = GetSpecialFolder( hWnd, nID, path, numof(path) ) );
2699: return bSuccess && SHELLEXECUTE_SUCCEEDED( MyShellExecute( hWnd, "open", path, null, null, nShow) );
2700: }//OpenSpecialFolder
2701:
2702: //*********************************************************
2703: // OpenWindowProcess
2704: //*********************************************************
2705: HANDLE
2706: OpenWindowProcess
2707: (
2708: HWND hWnd,
2709: DWORD dwFlag,
2710: bool bInherit
2711: )
2712: {
2713: // パラメタの仮定
2714: ASSERT( IsValidWindow( hWnd ) );
2715:
2716: DWORD dwProcessId;
2717: if ( GetWindowThreadProcessId( hWnd, &dwProcessId ) )
2718: {
2719: return OpenProcess( dwFlag, bInherit, dwProcessId );
2720: }
2721: return null;
2722: }//OpenWindowProcess
2723:
2724:
2725: //------------------------------------------------------------------------------------------------------------------
2726: // p
2727: //------------------------------------------------------------------------------------------------------------------
2728: //*********************************************************
2729: // PrivateProfile_DeleteKey()
2730: // ini ファイルから キー を削除する。
2731: // 成功すると 真 を返す。
2732: //*********************************************************
2733: bool // 成功すれば 真
2734: PrivateProfile_DeleteKey
2735: (
2736: const char *filename,
2737: const char *section,
2738: const char *key
2739: )
2740: {
2741: // パラメタの仮定
2742: ASSERT( IsValidLocalPathString( filename ) );
2743: ASSERT( IsValidStringPtr( section ) );
2744: ASSERT( '\0' != section[ 0 ] );
2745: ASSERT( IsValidStringPtr( key ) );
2746: ASSERT( '\0' != key[ 0 ] );
2747:
2748: const bool bSuccess = !! WritePrivateProfileString( section, key, null, filename );
2749: ASSERT( !bSuccess || !PrivateProfile_IsExistKey( filename, section, key ) );
2750:
2751: return bSuccess;
2752: }//PrivateProfile_DeleteKey
2753:
2754: //*********************************************************
2755: // PrivateProfile_DeleteSection()
2756: // ini ファイルから セクション全体 を削除する。
2757: // 成功すると 真 を返す。
2758: //*********************************************************
2759: bool // 成功すれば 真
2760: PrivateProfile_DeleteSection
2761: (
2762: const char *filename,
2763: const char *section
2764: )
2765: {
2766: // パラメタの仮定
2767: ASSERT( IsValidLocalPathString( filename ) );
2768: ASSERT( IsValidStringPtr( section ) );
2769: ASSERT( '\0' != section[ 0 ] );
2770:
2771: return !! WritePrivateProfileString( section, null, null, filename );
2772: }//PrivateProfile_DeleteSection
2773:
2774: //*********************************************************
2775: // PrivateProfile_IsExistKey()
2776: // キーが存在すれば 真 を返す。
2777: //
2778: //*********************************************************
2779: bool // キーが存在すれば 真
2780: PrivateProfile_IsExistKey
2781: (
2782: const char *filename,
2783: const char *section,
2784: const char *key
2785: )
2786: {
2787: // パラメタの仮定
2788: ASSERT( IsValidLocalPathString( filename ) );
2789: ASSERT( IsValidStringPtr( section ) );
2790: ASSERT( '\0' != section[ 0 ] );
2791: ASSERT( IsValidStringPtr( key ) );
2792: ASSERT( '\0' != key[ 0 ] );
2793:
2794: // キーが存在すれば常に一定の値が返る
2795: // キーが存在しなければデフォルト値が返る
2796: const int case_0 = GetPrivateProfileInt( section, key, 0, filename );
2797: const int case_1 = GetPrivateProfileInt( section, key, 1, filename );
2798:
2799: return case_0 == case_1;
2800: }//PrivateProfile_IsExistKey
2801:
2802: //*********************************************************
2803: // PrivateProfile_ReadBoolean
2804: //*********************************************************
2805: bool
2806: PrivateProfile_ReadBoolean
2807: (
2808: const char *filename,
2809: const char *section,
2810: const char *key,
2811: bool defval
2812: )
2813: {
2814: // パラメタの仮定
2815: ASSERT( IsValidLocalPathString( filename ) );
2816: ASSERT( IsValidStringPtr( section ) );
2817: ASSERT( '\0' != section[ 0 ] );
2818: ASSERT( IsValidStringPtr( key ) );
2819: ASSERT( '\0' != key[ 0 ] );
2820:
2821: char buffer[ 1024 ];
2822: #pragma memo( "toolini.cpp - GetPrivateProfileSection() の方が安全?" )
2823: const int count = GetPrivateProfileString( section, key, "", buffer, numof(buffer)-1, filename );
2824: ASSERT( '\0' == buffer[ count ] );
2825:
2826: int result;
2827: if ( 1 != sscanf( buffer, "%d", &result ) )
2828: return defval; // 読み込みに失敗した
2829:
2830: ASSERT( PrivateProfile_IsExistKey( filename, section, key ) );
2831: return boolean_cast( result );
2832: }//PrivateProfile_ReadBoolean
2833:
2834: //*********************************************************
2835: // PrivateProfile_ReadInteger
2836: //*********************************************************
2837: int
2838: PrivateProfile_ReadInteger
2839: (
2840: const char *filename,
2841: const char *section,
2842: const char *key,
2843: int defval
2844: )
2845: {
2846: // パラメタの仮定
2847: ASSERT( IsValidLocalPathString( filename ) );
2848: ASSERT( IsValidStringPtr( section ) );
2849: ASSERT( '\0' != section[ 0 ] );
2850: ASSERT( IsValidStringPtr( key ) );
2851: ASSERT( '\0' != key[ 0 ] );
2852:
2853: char buffer[ 1024 ];
2854: #pragma memo( "toolini.cpp - GetPrivateProfileSection() の方が安全?" )
2855: const int count = GetPrivateProfileString( section, key, "", buffer, numof(buffer)-1, filename );
2856: ASSERT( '\0' == buffer[ count ] );
2857:
2858: int result;
2859: if ( 1 != sscanf( buffer, "%d", &result ) )
2860: return defval;
2861:
2862: ASSERT( PrivateProfile_IsExistKey( filename, section, key ) );
2863: return result;
2864: }//PrivateProfile_ReadInteger
2865:
2866: //*********************************************************
2867: // PrivateProfile_WriteBoolean
2868: //*********************************************************
2869: bool
2870: PrivateProfile_WriteBoolean
2871: (
2872: const char *filename,
2873: const char *section,
2874: const char *key,
2875: bool value
2876: )
2877: {
2878: // パラメタの仮定
2879: ASSERT( IsValidLocalPathString( filename ) );
2880: ASSERT( IsValidStringPtr( section ) );
2881: ASSERT( '\0' != section[ 0 ] );
2882: ASSERT( IsValidStringPtr( key ) );
2883: ASSERT( '\0' != key[ 0 ] );
2884:
2885: // 文字列に変換する
2886: char string[ 256 ];
2887: VERIFY( 0 < snprintf( string, numof(string)-1, "%d", (value ? 1 : 0) ) );
2888: string[ numof(string)-1 ] = '\0';
2889: ASSERT( IsValidStringPtr( string ) );
2890:
2891: // 書き出し
2892: const bool bSuccess = !! WritePrivateProfileString( section, key, string, filename );
2893: ASSERT( !bSuccess || (value == PrivateProfile_ReadBoolean( filename, section, key, !!value )) );
2894:
2895: return bSuccess;
2896: }//PrivateProfile_WriteBoolean
2897:
2898: //*********************************************************
2899: // PrivateProfile_WriteInteger
2900: //*********************************************************
2901: bool
2902: PrivateProfile_WriteInteger
2903: (
2904: const char *filename,
2905: const char *section,
2906: const char *key,
2907: int value
2908: )
2909: {
2910: // パラメタの仮定
2911: ASSERT( IsValidLocalPathString( filename ) );
2912: ASSERT( IsValidStringPtr( section ) );
2913: ASSERT( '\0' != section[ 0 ] );
2914: ASSERT( IsValidStringPtr( key ) );
2915: ASSERT( '\0' != key[ 0 ] );
2916:
2917: // 文字列に変換する
2918: char string[ 256 ];
2919: VERIFY( 0 < snprintf( string, numof(string)-1, "%d", value ) );
2920: string[ numof(string)-1 ] = '\0';
2921: ASSERT( IsValidStringPtr( string ) );
2922:
2923: // 書き出し
2924: const bool bSuccess = !! WritePrivateProfileString( section, key, string, filename );
2925: ASSERT( !bSuccess || (value == PrivateProfile_ReadInteger( filename, section, key, 1 + value )) );
2926:
2927: return bSuccess;
2928: }//PrivateProfile_WriteInteger
2929:
2930: //*********************************************************
2931: // PrivateProfile_WriteString
2932: // 空白類文字列が無効になる仕様を文字列 data を二重引用符で囲むことで回避する
2933: //*********************************************************
2934: bool
2935: PrivateProfile_WriteString
2936: (
2937: const char *filename,
2938: const char *section,
2939: const char *key,
2940: const char *data
2941: )
2942: {
2943: // パラメタの仮定
2944: ASSERT( IsValidLocalPathString( filename ) );
2945: ASSERT( IsValidStringPtr( section ) );
2946: ASSERT( '\0' != section[ 0 ] );
2947: ASSERT( IsValidStringPtr( key ) );
2948: ASSERT( '\0' != key[ 0 ] );
2949: ASSERT( IsValidStringPtr( data ) );
2950:
2951: // 作業領域の確保
2952: const size_t length = 2 + strlen( data ); // 2 <= '"' + '"'
2953: const size_t bufsize = 1 + length; // 1 <= '\0'
2954: char *string = (char *)malloc( bufsize * sizeof( *string ) );
2955: if ( !string )
2956: {
2957: return false;
2958: }
2959:
2960: // 空白類文字列が無効になる仕様を回避するため文字列を二重引用符で囲む
2961: // snprintf("%c", '"') は VERIFY が拡張表記 '\"' を処理できないため
2962: VERIFY( (int)(length) == snprintf( string, bufsize, "%c%s%c", '"', data, '"' ) );
2963: ASSERT( '\0' == string[ length ] );
2964: string[ length ] = '\0';
2965:
2966: // 出力する
2967: ASSERT( IsValidStringPtr( string ) );
2968: const bool bSuccess = !! WritePrivateProfileString( section, key, string, filename );
2969:
2970: // 作業領域の破棄
2971: free( string );
2972:
2973: return bSuccess;
2974: }//PrivateProfile_WriteString
2975:
2976:
2977: //------------------------------------------------------------------------------------------------------------------
2978: // q
2979: //------------------------------------------------------------------------------------------------------------------
2980:
2981: //------------------------------------------------------------------------------------------------------------------
2982: // r
2983: //------------------------------------------------------------------------------------------------------------------
2984:
2985: //------------------------------------------------------------------------------------------------------------------
2986: // s
2987: //------------------------------------------------------------------------------------------------------------------
2988: //*********************************************************
2989: // SaveShellLink
2990: //*********************************************************
2991: bool
2992: SaveShellLink
2993: (
2994: IShellLink *psl,
2995: const char *path,
2996: bool bRemember
2997: )
2998: {
2999: // パラメタの仮定
3000: ASSERT( IsValidPtr( psl, sizeof( *psl ) ) );
3001: ASSERT( IsValidLocalPathString( path ) );
3002:
3003: const int count = MultiByteToWideChar( CP_ACP, 0, path, -1, null, 0 );
3004: if ( 0 < count )
3005: {
3006: WCHAR *wcPath = (WCHAR *)malloc( (1 + count) * sizeof( *wcPath ) );
3007: if ( wcPath )
3008: {
3009: VERIFY( count == MultiByteToWideChar( CP_ACP, 0, path, -1, wcPath, count ) );
3010:
3011: if ( SaveShellLinkW( psl, wcPath, bRemember ) )
3012: {
3013: free( wcPath );
3014: return true;
3015: }
3016: free( wcPath );
3017: }
3018: }
3019: return false;
3020: }//SaveShellLink
3021:
3022: //*********************************************************
3023: // SaveShellLinkW
3024: //*********************************************************
3025: bool
3026: SaveShellLinkW
3027: (
3028: IShellLink *psl,
3029: const WCHAR *wcLinkName,
3030: bool bRemember
3031: )
3032: {
3033: // パラメタの仮定
3034: ASSERT( IsValidPtr( psl, sizeof( *psl ) ) );
3035: ASSERT( IsValidStringPtr( (char *)wcLinkName ) );
3036:
3037: IPersistFile *ppf = ShellLink_QueryPersistFileInterface( psl );
3038: if ( !ppf )
3039: return false;
3040:
3041: const HRESULT hResult = ppf->Save( wcLinkName, bRemember );
3042: ppf->Release();
3043:
3044: return S_OK == hResult;
3045: }//SaveShellLinkW
3046:
3047: //*********************************************************
3048: // SetClipboardText()
3049: // クリップボードに文字列を格納します。
3050: //
3051: // HWND hwndOwner
3052: // クリップボードを専有するウィンドウ。
3053: // HWND_DESKTOP を指定すると現在のタスクがクリップボードを専有する。
3054: //
3055: // const char *string
3056: // クリップボードに格納する文字列。
3057: //
3058: //*********************************************************
3059: bool
3060: SetClipboardText
3061: (
3062: HWND hwndOwner, // クリップボードを専有するウィンドウ
3063: const char *string // クリップボードに格納する文字列
3064: )
3065: {
3066: // パラメタの仮定
3067: ASSERT( !hwndOwner || IsValidWindow( hwndOwner ) );
3068: ASSERT( IsValidStringPtr( string ) );
3069:
3070: // クリップボードに格納できるメモリハンドルは
3071: // HGLOBAL hMem = GlobalAlloc( GMEM_SHARE | GMEM_MOVEABLE,
3072: // に限られている
3073: const size_t bufsize = 1 + strlen( string );
3074: HGLOBAL hMem = GlobalAlloc( GMEM_SHARE | GMEM_MOVEABLE, bufsize );
3075: if ( !hMem )
3076: {
3077: BACKGROUND_MESSAGE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
3078: "関数 GlobalAlloc( GMEM_SHARE | GMEM_MOVEABLE ) が null を返しました。" );
3079: return false;
3080: }
3081:
3082: //
3083: char *buffer = (char *)GlobalLock( hMem );
3084: if ( buffer )
3085: {
3086: strcopy( buffer, bufsize, string );
3087: ASSERT( streql( buffer, string ) );
3088: GlobalUnlock( hMem ); // VERIFY( 0 == GlobalUnlock( hMem ) ); とは限らない
3089:
3090: if ( OpenClipboard( hwndOwner ) )
3091: {
3092: VERIFY( EmptyClipboard() );
3093: VERIFY( hMem == SetClipboardData( CF_TEXT, hMem ) );
3094: VERIFY( CloseClipboard() );
3095: return true;
3096: }
3097: else
3098: {
3099: BACKGROUND_MESSAGE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
3100: "関数 OpenClipboard() が false を返しました。" );
3101: }
3102: }
3103: else
3104: {
3105: BACKGROUND_MESSAGE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
3106: "関数 GlobalLock() が null を返しました。" );
3107: }
3108:
3109: VERIFY( !GlobalFree( hMem ) );
3110: return false;
3111: }//SetClipboardText
3112:
3113: //*********************************************************
3114: // SetCurrentProcessPriorityClass
3115: //*********************************************************
3116: bool
3117: SetCurrentProcessPriorityClass
3118: (
3119: DWORD dwPriorityClass
3120: )
3121: {
3122: // パラメタの仮定
3123: ASSERT( ( NORMAL_PRIORITY_CLASS == dwPriorityClass )
3124: || ( IDLE_PRIORITY_CLASS == dwPriorityClass )
3125: || ( HIGH_PRIORITY_CLASS == dwPriorityClass )
3126: || ( REALTIME_PRIORITY_CLASS == dwPriorityClass ) );
3127:
3128: HANDLE hCurrentProcess = GetCurrentProcess();
3129: return !! SetPriorityClass( hCurrentProcess, dwPriorityClass );
3130: }//SetCurrentProcessPriorityClass
3131:
3132: //*********************************************************
3133: // SetRegKeyString
3134: //*********************************************************
3135: bool
3136: SetRegKeyString
3137: (
3138: HKEY hKey,
3139: const char *name,
3140: const char *string
3141: )
3142: {
3143: // パラメタの仮定
3144: ASSERT( IsValidRegKeyHandle( hKey ) );
3145: ASSERT( IsValidStringPtr( string ) );
3146: ASSERT( !name || IsValidRegistryValueName( name ) );
3147:
3148: const size_t length = strlen( string );
3149: return ERROR_SUCCESS == RegSetValueEx
3150: (
3151: hKey,
3152: name,
3153: 0, // reserved
3154: REG_SZ,
3155: (const BYTE *)string,
3156: SIZE_T_TO_DWORD( (1 + length) * sizeof( *string ) )
3157: );
3158: }//SetRegKeyString
3159:
3160: //*********************************************************
3161: // SetWallPaperFile
3162: // flags = SPIF_UPDATEINIFILE, SPIF_SENDWININICHANGE, ...
3163: //*********************************************************
3164: bool
3165: SetWallPaperFile
3166: (
3167: const char *filename,
3168: UINT flags
3169: )
3170: {
3171: // パラメタの仮定
3172: ASSERT( IsValidStringPtr( filename ) );
3173: ASSERT( ('\0' == filename[0]) || IsPathFile( filename ) );
3174:
3175: return !! SystemParametersInfo( SPI_SETDESKWALLPAPER, 0, (void *)filename, flags );
3176: }//SetWallPaperFile
3177:
3178: //*********************************************************
3179: // ShellLink_QueryPersistFileInterface
3180: //*********************************************************
3181: IPersistFile *
3182: ShellLink_QueryPersistFileInterface
3183: (
3184: IShellLink *psl
3185: )
3186: {
3187: // パラメタの仮定
3188: ASSERT( IsValidPtr( psl, sizeof( *psl ) ) );
3189:
3190: IPersistFile *ppf;
3191: if ( S_OK != psl->QueryInterface( IID_IPersistFile, (void **)&ppf ) )
3192: return null;
3193:
3194: ASSERT( IsValidPtr( ppf, sizeof( *ppf ) ) );
3195: return ppf;
3196: }//ShellLink_QueryPersistFileInterface
3197:
3198: //*********************************************************
3199: // 関数名:
3200: // SHGetFileIcon
3201: //
3202: // 戻り値:
3203: // HICON …… 取得したアイコンのハンドル
3204: // 使用後は DestroyIcon() で破棄
3205: // 引数:
3206: // path …… アイコンを取得するファイルのファイル名
3207: // flags …… 取得するアイコンの種類
3208: // ・SHGFI_LARGEICON // 大きいアイコン
3209: // ・SHGFI_SMALLICON // 小さいアイコン
3210: // ・SHGFI_OPENICON // 開いているアイコン
3211: // ・SHGFI_SHELLICONSIZE // [英語] get shell size icon
3212: // ・SHGFI_LINKOVERLAY // ショートカット
3213: // ・SHGFI_SELECTED // 選択時のアイコン
3214: //*********************************************************
3215: HICON
3216: SHGetFileIcon
3217: (
3218: const char *path,
3219: UINT flags
3220: )
3221: {
3222: // パラメタの仮定
3223: ASSERT( IsPathExist( path ) );
3224:
3225: SHFILEINFO shfi;
3226: SHGetFileInfo( path, 0, &shfi, sizeof( shfi ), SHGFI_ICON | flags );
3227: return shfi.hIcon;
3228: }//SHGetFileIcon
3229:
3230: //*********************************************************
3231: // 関数名:
3232: // SHGetInstanceIcon
3233: //
3234: // 戻り値:
3235: // HICON …… 取得したアイコンのハンドル
3236: // 使用後は DestroyIcon() で破棄
3237: //
3238: // 引数:
3239: // hInstance …… アイコンを取得するファイルのファイル名
3240: // flags …… 取得するアイコンの種類
3241: // ・SHGFI_LARGEICON // 大きいアイコン
3242: // ・SHGFI_SMALLICON // 小さいアイコン
3243: // ・SHGFI_OPENICON // 開いているアイコン
3244: // ・SHGFI_SHELLICONSIZE // [英語] get shell size icon
3245: // ・SHGFI_LINKOVERLAY // ショートカット
3246: // ・SHGFI_SELECTED // 選択時のアイコン
3247: //*********************************************************
3248: HICON
3249: SHGetInstanceIcon
3250: (
3251: HINSTANCE hInstance,
3252: UINT flags
3253: )
3254: {
3255: // パラメタの仮定
3256: ASSERT( IsValidInstanceHandle( hInstance ) );
3257:
3258: char filename[ MAX_PATH_BUF ]; // インスタンスに関連づけられているファイル名
3259: if ( !GetModuleFileName( hInstance, filename, numof(filename) ) )
3260: return null; // ファイルの取得に失敗
3261:
3262: ASSERT( IsPathFile( filename ) );
3263: return SHGetFileIcon( filename, flags );
3264: }//SHGetInstanceIcon
3265:
3266:
3267: //------------------------------------------------------------------------------------------------------------------
3268: // t
3269: //------------------------------------------------------------------------------------------------------------------
3270:
3271: //------------------------------------------------------------------------------------------------------------------
3272: // u
3273: //------------------------------------------------------------------------------------------------------------------
3274: //*********************************************************
3275: // UpdateNotifyIcon
3276: // 消えてしまったアイコンを再登録する
3277: //*********************************************************
3278: bool
3279: UpdateNotifyIcon
3280: (
3281: NOTIFYICONDATA *nid
3282: )
3283: {
3284: // パラメタの仮定
3285: ASSERT( IsValidNotifyIconData( nid ) );
3286:
3287: DeleteNotifyIcon( nid );
3288:
3289: return AddNotifyIcon( nid );
3290: }//UpdateNotifyIcon
3291:
3292:
3293: //------------------------------------------------------------------------------------------------------------------
3294: // v
3295: //------------------------------------------------------------------------------------------------------------------
3296:
3297: //------------------------------------------------------------------------------------------------------------------
3298: // w
3299: //------------------------------------------------------------------------------------------------------------------
3300:
3301: //------------------------------------------------------------------------------------------------------------------
3302: // x
3303: //------------------------------------------------------------------------------------------------------------------
3304:
3305: //------------------------------------------------------------------------------------------------------------------
3306: // y
3307: //------------------------------------------------------------------------------------------------------------------
3308:
3309: //------------------------------------------------------------------------------------------------------------------
3310: // z
3311: //------------------------------------------------------------------------------------------------------------------
3312:
3313:
3314: //******************************************************************************************************************
3315: // private
3316: //******************************************************************************************************************
3317: //*********************************************************
3318: // CreateFindFileHandle
3319: // [確証なし] スタック領域節約のための方策
3320: //*********************************************************
3321: static
3322: HANDLE
3323: CreateFindFileHandle
3324: (
3325: const char *path,
3326: const char *mask,
3327: WIN32_FIND_DATA *wfd
3328: )
3329: {
3330: ASSERT( IsPathDirectory( path ) );
3331: ASSERT( IsValidStringPtr( mask ) );
3332: ASSERT( IsValidPtr( wfd, sizeof( *wfd ) ) );
3333:
3334: char findmask[ MAX_PATH_BUF ];
3335: MakeFullPath( findmask, numof( findmask ), path, mask );
3336: return FindFirstFile( findmask, wfd );
3337: }//CreateFindFileHandle
3338:
3339:
3340: //******************************************************************************************************************
3341: // TEST
3342: //******************************************************************************************************************
3343:
3344:
3345: #ifdef _DEBUG // デバッグ時のみ
3346:
3347:
3348: //*********************************************************
3349: // test_vkeyname()
3350: //*********************************************************
3351: DEFINE_TESTPROC( test_vkeyname )
3352: {
3353: //---------------------------------------------------------
3354: // 定数 の テスト
3355: //---------------------------------------------------------
3356:
3357: //---------------------------------------------------------
3358: // ファイルスコープ関数 の テスト
3359: //---------------------------------------------------------
3360:
3361: //---------------------------------------------------------
3362: // 公開関数 の テスト
3363: //---------------------------------------------------------
3364:
3365: // GetVirtualKeyNameText()
3366: {
3367: // MapVirtualKey() の範囲を絞り込む
3368: // 0x00 <= vkey <= 0xFF
3369: {for( int vkey = VK_MAX + 1; vkey < 0xFFFF; ++vkey )
3370: {
3371: // 常に変換に失敗
3372: VERIFY( 0 == MapVirtualKey( vkey, 0 ));
3373: }}
3374:
3375: // キー名取得のテスト
3376: {for( int vkey = VK_MIN; vkey <= VK_MAX; ++vkey )
3377: {
3378: {for( int j = 0; j < 2; ++j )
3379: {
3380: const bool extend = (0 != (j & 1));
3381:
3382: // 十分なバッファ
3383: char buffer_1[ MAX_KEYNAMELENGTH+1 ];
3384: {
3385: const int length = GetVirtualKeyNameText( buffer_1, numof(buffer_1), vkey, extend );
3386: VERIFY( length < numof(buffer_1) );
3387: VERIFY( (length <= 0) || ('\0' == buffer_1[ length ]) );
3388: }
3389:
3390: // バッファが不足
3391: char buffer_2[ 2 ];
3392: {
3393: const int length = GetVirtualKeyNameText( buffer_2, numof(buffer_2), vkey, extend );
3394: VERIFY( length < numof(buffer_2) );
3395: VERIFY( (length <= 0) || (buffer_1[ 0 ] == buffer_2[ 0 ]) );
3396: VERIFY( (length <= 0) || ('\0' == buffer_2[ 1 ]) );
3397: }
3398: }}
3399: }}
3400: }
3401:
3402: }//test_vkeyname
3403:
3404:
3405: #endif // #ifdef _DEBUG
3406:
3407:
3408: //** end **
参照:
水無瀬の部屋 > sample > tools > toolsys.cpp |
---|
このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/tools/toolsys_cpp.shtml